В языке программирования C может ли функция main начинаться с main() вместо int main()?

Я читаю «Язык программирования C, 2-е издание» Денниса Ритчи и Брайана Кернигана. На странице 38 основная часть программы начинается с main() вместо int main(), я считаю, что это ошибка. Но я начинающий программист. Существуют ли какие-либо особые условия или случаи, при которых не нужно указывать тип int перед основной функцией?

Я попробовал без упоминания int, но компилятор не выполнился.

Эта книга старая и не соответствует современным стандартам. Основная функция должна быть объявлена ​​с явным int возвращаемым типом.

Some programmer dude 02.07.2024 17:19

Даже int main() не совсем правильно. Вам необходимо указать его параметры, например. int main(void).

pmacfarlane 02.07.2024 17:29

Второе издание было опубликовано незадолго до завершения разработки C90. Из уважения к существующей кодовой базе (большой) в C90 разрешено использовать main() вместо int main(void) и т. д. В C99 поддержка этого официально прекращена. K&R была отличной книгой в свое время (особенно 1-е изд. 1978 года). С тех пор мир изменился, C эволюционировал, и существует ряд частей K&R 2, которые больше не компилируются и не работают надежно. Это делает вступительный текст менее удовлетворительным. Мне больно это говорить. Я выучил C по 1-му изд., и у меня есть копия 2-го изд. — я очень уважаю их обоих. Но…

Jonathan Leffler 02.07.2024 17:32

@pmacfarlane: стандарты C18 и более ранние показывают примеры int main(). Это не неверно — но оно не предоставляет прототипа для main(), как и int function(); не предоставляет прототип. Это объявление function, но список аргументов неопределенен (но это не вариативная функция — ее сигнатура определения не заканчивается на , ...)). C23 все меняет. Использование int function(); в C23 эквивалентно int function(void); и является прототипом функции. Это может вызвать проблемы для старого кода. Не поймите меня неправильно: я предпочитаю int main(void), но…

Jonathan Leffler 02.07.2024 17:35
godbolt.org/z/6x4q39fhG <- вы можете попросить компилятор использовать стандарт c90, который должен позволить компилировать код; но лучше было бы найти более свежую книгу. Книга K+R — классика, но за прошедшие десятилетия ее язык несколько изменился.
teapot418 02.07.2024 17:43

@pmacfarlane Для определения функции пустой список типов параметров эквивалентен списку типов параметров void. Для объявления функции пустой список типов параметров объявляет, что функция имеет неизвестные параметры (до C23) или не имеет параметров (после C23).

Ian Abbott 02.07.2024 19:07

K&R был неверен даже для C89, потому что каждый пример в книге вызывает UB при использовании, например, в Unix, системе, которая использует значение, возвращаемое функцией main(). Связанный материал: Соответствовали ли когда-нибудь примеры кода от K&R?Книга не просто устарела — 2-е издание изначально никогда не было правильным.

Lundin 03.07.2024 10:08
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
92
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Самые ранние версии 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 04.07.2024 11:12

@Greeshma: Начиная с C99, все функции, включая main, должны иметь явное указание типа. Неявная типизация больше нигде не разрешена.

John Bode 04.07.2024 21:27

Другие вопросы по теме