Почему GCC не согласен с выдачей предупреждений для незаявленных функций? - PullRequest
5 голосов
/ 23 февраля 2012

Следующая test.c программа

int main() {
   dummySum(1, 2);
   return 0;
}

int dummySum(int a, int b) {
   return a + b;
}

... не генерирует никаких предупреждений при компиляции с gcc -o test test.c, тогда как следующее:

int main() {
   dummySum(1, 2);
   return 0;
}

void dummySum(int a, int b) {
   a + b;
}

Почему

Ответы [ 2 ]

8 голосов
/ 23 февраля 2012

Когда сталкивается с необъявленной функцией, компилятор принимает функцию, которая принимает заданное количество аргументов (я думаю) и возвращает int (ту часть, в которой я уверен) . Ваш второй нет, поэтому вы получаете предупреждение о переопределении.

Я полагаю, что, основываясь на очень быстром сканировании вперед, C99 ( PDF link ) удалил это. Неудивительно, что GCC по-прежнему позволяет им (с предупреждением); Я не могу себе представить, сколько кода может перестать компилироваться ...


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

2 голосов
/ 23 февраля 2012

Функция не может быть использована до того, как она была объявлена. Когда объявление функции не отображается, реализация в C89 предполагает, что функция:

  • принимает неопределенное (но фиксированное) количество параметров

  • возвращает int

Это называется неявным объявлением функции .

В C99 неявные объявления функций были удалены из языка, и реализация свободна отказаться от перевода исходного кода.

...