Неявное объявление при использовании функции до ее определения в C, почему компилятор не может понять это? - PullRequest
1 голос
/ 10 января 2011

Как видно из названия, я знаю, что вызывает эту ошибку, но я хочу знать, почему компилятор дает это в таких обстоятельствах.

Например:

main.c

void test(){
    test1();
}

void test1(){
   ...
}

выдаст предупреждение о неявном объявлении, так как компилятор достигнет вызова test1 () до того, как прочитает свое объявление, я могу видеть очевидные проблемы с этим (не зная возвращаемого типа и т. Д.), Но почемукомпилятор делает простой проход, чтобы получить все объявления функций, а затем компилирует код, удаляющий эти ошибки?Это просто кажется очень простым, и я не думаю, что видел подобные предупреждения на других языках.

Кто-нибудь знает, есть ли какая-то конкретная цель для этого предупреждения в такой ситуации, которую я пропускаю?

Ответы [ 4 ]

5 голосов
/ 10 января 2011

Я предполагаю, что поскольку C - довольно старый язык, относящийся к 1972 году, это было сделано намеренно из-за ограничений памяти и скорости.

Как определено, компилятор должен выполнить одно сканирование вашего файла, чтобы узнать все, что нужно для компиляции.Необходимость сделать два прохода была бы более дорогой, и поэтому это правило сохранилось до наших дней.

Кроме того, как отметил peoro, это правило облегчает жизнь автора компилятора.Не говоря уже о том, что жизнь IDE для автозаполнения также облегчит ее жизнь.

Итак, небольшое раздражение для разработчиков программ означает, в частности, облегчение жизни создателей компиляторов и разработчиков IDE.и ваши программы будут компилироваться быстрее.Неплохо, когда у вас в руках многомиллионная кодовая база.

3 голосов
/ 10 января 2011

Это способ определения C.

Перед использованием существует правило , которое заставляет вас объявлять символы перед их использованием.

В основном это облегчает жизнь компиляторам.

0 голосов
/ 10 января 2011

Это может даже не показаться, но такой подход также экономит ваше время! Представьте, что вы компилируете модуль компиляции с тысячами файлов: в вашем сценарии компилятор должен сначала сократить тысячи файлов, а затем увидеть «О, эта функция не существует. Способ, которым это реализовало, прерывает компиляцию, как только он видит неопределенную функцию. Это экономит ваше время.

0 голосов
/ 10 января 2011

Краткий ответ: потому что C ooooold.: -)

Длинный ответ: компилятор C и компоновщик полностью разделены.Возможно, вы определяете разные функции для разных исходных файлов, а затем связываете их вместе.В этом случае, скажем, что вы определили test1 в отдельном исходном файле библиотеки.Компилятор не узнает о test1, пока не скомпилирует другой файл, и скомпилирует другой файл отдельно, поэтому он не может знать об этом при компиляции test.Поэтому вы должны сказать ему: «Да, действительно, test1 определено в другом месте, и вот его подпись».Вот почему вы обычно включаете в этот файл заголовка (.h) для любых других исходных файлов, функции которых вам нужно использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...