Я читаю «Язык программирования C, 2-е издание» Денниса Ритчи и Брайана Кернигана. На странице 38 основная часть программы начинается с main()
вместо int main()
, я считаю, что это ошибка. Но я начинающий программист. Существуют ли какие-либо особые условия или случаи, при которых не нужно указывать тип int
перед основной функцией?
Я попробовал без упоминания int
, но компилятор не выполнился.
Даже int main()
не совсем правильно. Вам необходимо указать его параметры, например. int main(void)
.
Второе издание было опубликовано незадолго до завершения разработки C90. Из уважения к существующей кодовой базе (большой) в C90 разрешено использовать main()
вместо int main(void)
и т. д. В C99 поддержка этого официально прекращена. K&R была отличной книгой в свое время (особенно 1-е изд. 1978 года). С тех пор мир изменился, C эволюционировал, и существует ряд частей K&R 2, которые больше не компилируются и не работают надежно. Это делает вступительный текст менее удовлетворительным. Мне больно это говорить. Я выучил C по 1-му изд., и у меня есть копия 2-го изд. — я очень уважаю их обоих. Но…
@pmacfarlane: стандарты C18 и более ранние показывают примеры int main()
. Это не неверно — но оно не предоставляет прототипа для main()
, как и int function();
не предоставляет прототип. Это объявление function
, но список аргументов неопределенен (но это не вариативная функция — ее сигнатура определения не заканчивается на , ...)
). C23 все меняет. Использование int function();
в C23 эквивалентно int function(void);
и является прототипом функции. Это может вызвать проблемы для старого кода. Не поймите меня неправильно: я предпочитаю int main(void)
, но…
@pmacfarlane Для определения функции пустой список типов параметров эквивалентен списку типов параметров void
. Для объявления функции пустой список типов параметров объявляет, что функция имеет неизвестные параметры (до C23) или не имеет параметров (после C23).
K&R был неверен даже для C89, потому что каждый пример в книге вызывает UB при использовании, например, в Unix, системе, которая использует значение, возвращаемое функцией main(). Связанный материал: Соответствовали ли когда-нибудь примеры кода от K&R?Книга не просто устарела — 2-е издание изначально никогда не было правильным.
Самые ранние версии C (вплоть до C99) допускали «неявное int
» определение; Предполагалось, что функции, не имеющие явного типа, возвращают int
. В K&R C даже не было синтаксиса прототипа функции, поэтому определения функций с параметрами выглядели следующим образом:
/**
* Return type is assumed to be int
*
* Parameter list only contains the names of the parameters;
* types must be specified in a separate declaration
*/
foo(x, y)
int x;
int y;
{
return x*y;
}
Так что да, во многих очень старых кодах C (с 1970-х по конец 1980-х годов) вы увидите main
, определяемый как
main()
{
...
}
или
main(argc, argv)
int argc;
char **argv;
{
...
}
Практика, начиная с C89, заключается в использовании синтаксиса прототипа, и снова неявный int
больше не допускается, начиная с C99, поэтому main
следует определять как
int main( void )
{
...
}
или
int main( int argc, char **argv )
{
...
}
Ты прав! Но я немного запутался: зачем явно указывать int
перед main? При этом вам не нужно указывать тип данных для других функций. Допустим, я звоню foo();
Ведь даже int main() — это функция.
@Greeshma: Начиная с C99, все функции, включая main
, должны иметь явное указание типа. Неявная типизация больше нигде не разрешена.
Эта книга старая и не соответствует современным стандартам. Основная функция должна быть объявлена с явным
int
возвращаемым типом.