4

Вызывает ли следующая программа Undefined Behaviour в C?Неявное объявление в C

int main() 
{ 
    printf("Printf asking: Where is my declaration ?"); 
} 

В приведенной выше программе имеется неявная декларация printf(), так выше код полностью совместим со стандартом или он просто имеет некоторые реализации конкретного поведения?

+0

Ну, кроме того, что вы не возвращаете значение ... –

+2

В C99 явное 'return 0' в' main() 'является необязательным. Отредактированные теги :-) –

ответ

7

Да, так оно и есть. Не имеет декларации в области UB.

J.2 Неопределенное поведение

- Для вызова функции без прототипа функции в объеме, где функция определяется с функцией прототипа, либо прототип заканчивается многоточием или типы аргументов после продвижения по службе не являются , совместимыми с типами параметров (6.5.2.2).

Кроме того, обратите внимание, что падение с конца в норме на C99 (т. Е. Семантически эквивалентно return 0;). Для компиляторов, совместимых с pre-C99, вам нужен оператор возврата, где тип возврата основной функции - тип, совместимый с int.

+0

Спасибо за J.2, AC :) –

+5

Обратите внимание, что единственная причина, по которой применяется данная точка, заключается в том, что список параметров 'printf' заканчивается многоточием. Это не относится к, скажем, 'puts', поскольку тип параметра верен. –

+0

Помните, что эллипсис влияет только на реализацию этой функции. Значения выталкиваются в стек так же, как это считалось одним из удобств C - вы могли бы нажимать все, что захотите, на стек, но затем вы будете отвечать за его очистку снова. С другой стороны, Delphi потребовала вызванную процедуру для очистки стека. –

Смежные вопросы