До стандарта ANSI C 1989 года у C не было прототипов (объявлений функций, определяющих типы параметров); эти объявления и определения в старом стиле были всем, что было доступно.
В 1989 году стандарт ANSI C (который по сути стал стандартом ISO C 1990 года) представил прототипы. Если я правильно помню, идея на самом деле пришла из C ++ (который еще не был стандартизирован в то время). Объявления и определения в старом стиле оставались законными, поэтому старый код можно было скомпилировать. Стандарт 1989 года также гласил, что декларации старого стиля «устарели», что означает, что они могут быть удалены в будущей версии стандарта.
Стандарт ISO C 1999 года, который (официально) заменил стандарт 1990 года, оставил это в покое; объявления и определения в старом стиле все еще допустимы, и все соответствующие компиляторы должны их поддерживать (хотя они могут предупреждать о них, поскольку они могут предупреждать обо всем остальном).
Начиная с последней версии C201X (большой PDF), этот все еще не изменился. Объявления и определения функций старого стиля по-прежнему являются обязательной частью языка, и все соответствующие компиляторы должны их поддерживать. (Лично я считаю это неудачным.)
C ++, с другой стороны, никогда (?) Никогда не поддерживал ничего, кроме прототипов, в качестве объявлений функций; Страуструп не особо заботился о сохранении совместимости со старым кодом Си.
Но если вам не нужно поддерживать очень старый код и / или использовать очень старые компиляторы, нет веских причин использовать объявления или определения функций старого стиля.
Обратите внимание, что, по крайней мере, в C, это определение:
int main() {
/* ... */
}
на самом деле это определение старого стиля. Это верно для C ++, где это прототип, указывающий, что main
не имеет параметров, но в C это должно быть
int main(void) {
/* ... */
}
(C ++ также принимает эту форму для совместимости с C - но к тому времени, когда вы пишете main
, вы уже должны были решить, какой язык вы используете.)