В старом C существовала вещь, называемая неявным объявлением функции.Когда появился вызов необъявленной функции, предполагалось, что она имеет тип int()
, то есть функцию, которая принимает неопределенное количество параметров и возвращает int
.
int main()
{
foo(); // foo is implicitly declared as `int foo()`
}
Начиная с C99 это недопустимо,Включите предупреждения компилятора и используйте правильный языковой диалект.
Есть еще такие причуды из старости.Например, вы можете объявить аргументы функции без типа, а тип будет неявным int
:
int test(a) // a type is implicitly int
{
a = 11;
return a;
}
Вышеприведенное даже не генерирует никаких предупреждений, если не используется -pedantic
Если вы хотите сойти с ума, скомпилируйте это:
double test(a, b)
int a;
double b;
{
a = 11;
b = 3.14;
return a + b;
}
Это старый способ (время K & R) объявления переменных, и я не нашел никаких флагов, чтобы вызвать предупреждение.
Так что да, старый Си странный и находит способ проникнуть даже сегодня.