gcc не предупреждает о вызове нулевой функции с параметрами? - PullRequest
9 голосов
/ 10 августа 2010

Может кто-нибудь сказать мне, почему в блейз GCC (например, 4.4.3) не предупреждает или не ошибается неправильный вызов нулевой функции?

void hello() {
}

int main( int argc, char* argv[] ) {
 int test = 1234;
 hello(test);

 return 0;
}

(см. Также http://bytes.com/topic/c/answers/893146-gcc-doesnt-warn-about-calling-nullary-function-parameters)

Ответы [ 4 ]

12 голосов
/ 10 августа 2010

Потому что:

void hello() {

не означает, что вы думаете, что делает. Использование:

void hello( void ) {

Без пустоты вы говорите, что не можете быть обеспокоены указанием параметров. Обратите внимание, что это один из многих отличий C от C ++.

11 голосов
/ 10 августа 2010

В C void hello() объявляет функцию hello(), которая возвращает void и принимает unspecified number of arguments.

Примечание

В C ++ все это по другому сценарию. void hello() в C ++ объявляет функцию hello(), которая возвращает void и принимает no arguments.

4 голосов
/ 10 августа 2010

Из того, что я могу почерпнуть из Книга C 4.2 , ваше определение функции не является прототипом, поскольку в нем не указывается информация о типах аргументов. Это означает, что компилятор запоминает только тип возвращаемого значения и не сохраняет никакой информации об аргументах.

Эта форма определения все еще разрешена для обратной совместимости и не ограничивается функциями, которые не принимают аргументов. gcc одинаково разрешит что-то вроде

void hello( a ) {
}

int main( int argc, char* argv[] ) {
 int test = 1234;
 hello(test,1);

 return 0;
}

Здесь важно только отсутствие информации о типе аргументов. Чтобы исправить это и убедиться, что gcc проверяет аргументы при использовании функции, вы можете поместить информацию о типе либо в объявление вашей функции, либо в определение. Желательно, чтобы вы поместили их в оба.

Все это, конечно, все еще не отвечает на ваш вопрос о том, почему gcc не предупреждает вас. Должно быть, дело в том, что команда gcc считает, что кода С по-прежнему достаточно, чтобы оправдать подавление предупреждения по умолчанию. IMO Я удивлен, что опция -Wstrict-prototype, как упомянуто @caf, не включена по умолчанию.

1 голос
/ 10 августа 2010

Ха, у меня было это на днях.

Ваше определение должно быть:

void hello(void);

В противном случае функция может принимать любое количество параметров.

НоЯ понимаю вашу точку зрения.Почти нет компиляторов, которые бы даже предупреждали об этом.

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