Страницы

Поиск по вопросам

воскресенье, 9 февраля 2020 г.

Неявная декларация

#c #language_lawyer


Подскажите, пожалуйста, если в a.c нет объявления функции, которая определена в b.c,
но при этом в a.c происходит вызов такой функции, то что происходит? 

Интересует язык C.

В описанной ситуации MinGW-w64 говорит:

warning: implicit declaration of function '...'


Я так понимаю, что в этом случае происходит неявная декларация (объявление) функции?

Правильно ли я понимаю, что код работает только потому, что автоматически сформированная
сигнатура совпадает с реальной сигнатурой? Если она не совпадет, то это неопределенное
поведение?

Хочу разобраться подробнее.
    


Ответы

Ответ 1



К современному С эта тема имеет отношение только в контексте вызова функции, объявленной без прототипа. Современный язык С запрещает вызов необъявленных функций. Начиная с C99 все функции должны быть объявлены пред вызовом. Вызов необъявленной функции - это constraint violation, т.е. ошибка. Все остальное - самодеятельность вашего компилятора, к языку С никакого отношения не имеющая. В устаревшем стандарте C89/90 вызов необъявленных функций разрешался. Компилятор пытался "угадать" тип функции на основе количества и типов передаваемых аргументов (типы аргументов после default argument promotions), а также подразумевал возвращаемое значение типа int. short s = 0; /* Вызов необъявленной функции */ foo(s, 5, 3.14f, "H"); /* Компилятор предполагает: int foo(int, int, double, char *) */ Современный С ведет себя по этой же схеме, если объявление функции сделано, но без прототипа (т.наз. "объявления в K&R стиле"). Угадывать тип возвращаемого значения больше не нужно, т.к. он явно присутствует в объявлении, а угадывание типов параметров делается по-старому. Объявления без прототипа являются deprecated. Если "угаданный" тип функции несовместим с фактическим - поведение не определено. При попытке вызова variadic функции без предварительного объявления поведение не определено в любом случае.

Комментариев нет:

Отправить комментарий