ответ caf только частично правильно.
В соответствии с правилами, указанными в стандарте C89 / C90 (обычно называемом «ANSI C»), вызов функции без видимого объявления является законным. Компилятор предполагает, что функция возвращает результат int
и принимает аргументы (повышенного) типа (типов), заданных в вызове. Если вызов не соответствует определению функции, поведение не определено. Для такого вызова ответственность за правильность вызова лежит исключительно на программисте; Компилятор, скорее всего, не скажет вам, если вы допустили ошибку.
Стандарт ISO C 1999 года отбросил это "неявное int
" правило и сделал необъявленную функцию вызовом нарушения ограничения , требующего диагностики. (Диагностика может быть нефатальным предупреждением или может привести к сбою компиляции.) После того, как диагностика напечатана, если компилятор создает исполняемый файл, его поведение не определено.
К сожалению, многие компиляторы по-прежнему не применяют современные правила Си по умолчанию. Большинство из них можно сделать с помощью соответствующих параметров времени компиляции.
В частности, для gcc вы можете скомпилировать с помощью
gcc -std=c99 -pedantic
или
gcc -std=c11 -pedantic
(Последний еще не существовал, когда был написан ответ caf.) Или, если вы также хотите использовать специфичные для gcc расширения, вы можете использовать -std=gnu99
или -std=gnu11
. По умолчанию в настоящее время -std=gnu89
. Вероятно, это будет изменено на -std=gnu11
в будущем выпуске gcc.
gcc-совместимые компиляторы, такие как clang, обычно следуют тем же правилам. Что касается других компиляторов, вам придется ознакомиться с их документацией, чтобы узнать, как убедить их применять современные правила Си. (Компилятор Microsoft C имеет очень неполную поддержку стандартов позже C90.)