@ Эрик отвечает правильно, но (IMO) может быть довольно легко неправильно понято.
То, что у вас есть, это определение стиля K & R, это полностью верно.Поскольку int
считается типом по умолчанию, если у вас есть что-то вроде: foo(n) { }
, это означает, что тип возвращаемого значения и тип n
по умолчанию int
.
C99 (в основном)удаляет правило «int по умолчанию», но не полностью удаляет определения стиля K & R.Это означает, что приведенное выше определение больше не допускается;чтобы определить foo
с теми же типами, что и выше, вы все равно можете использовать:
int foo(n)
int n;
{
}
Т.е. определение стиля K & R все еще разрешено, но вы do должны указать возвращаемое значениеtype и параметр type, даже если тип int.
Однако этот стиль определения функции устарел (согласно §6.11.7).Это действительно только разрешено ради древнего (предварительно стандартного) кода.Вы не хотите писать новый код таким способом, хотя технически это все еще разрешено.Для нового кода вы явно хотите использовать определение в стиле прототипа:
int foo(int n) {}
Для тех, кто заботится о таких вещах, определение стиля K & R все еще используется в каком-то новом коде.Его более короткий стиль может быть полезен (используя термин «свободно») в коде-гольфе.
Пока мы на нем: ответ @ stijn также является своего рода правильным.В частности, когда функция определяется таким образом (т. Е. Стиль K & R), все аргументы подлежат продвижению по умолчанию.Это означает, что если вы передадите целочисленный тип, меньший int
, он будет повышен до int
, а если вы передадите float
, он будет повышен до double
.