Из того, что я могу почерпнуть из Книга 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, не включена по умолчанию.