Почему тип основной функции в C и С++ оставлен пользователю для определения?

Почему main() является определяемой пользователем функцией?

Когда я буду использовать void main() и int main()?

Ответы

Ответ 1

РЕДАКТИРОВАТЬ. Этот ответ не является таким полным, каким он может быть, поскольку на самом деле он не затрагивает странное предложение "или каким-либо другим способом, определенным определенным образом". Я уже написал более полный ответ, который также относится к C90, C11 и С++. КОНЕЦ РЕДАКТИРОВАНИЯ

Вот что говорит стандарт C (ISO C 9899: 1999):

5.1.2.1 Свободная среда

В автономной среде (в которые C выполнение программы может иметь место без какой-либо выгоды от система), имя и тип функции, вызванной при запуске программы, являются реализации. /../ Эффект завершения программы в автономная среда от реализации.

5.1.2.2 Хостинг среды

Не рекомендуется предоставлять размещенную среду, но должны соответствовать следующим если есть.

5.1.2.2.1 Запуск программы

Функция, вызванная при запуске программы, называется главный. Реализация не объявляет прототип для этой функции. Он должен быть определен с типом возврата int и без параметров:

int main (void) {/*... */}

или с двумя параметрами (см. здесь как argc и argv, хотя любой имена могут использоваться, поскольку они являются локальными к функции, в которой они объявлена):

int main (int argc, char * argv []) {/*... */}

Текст в стандарте С++ более или менее идентичен. Обратите внимание, что "запуск программы" в тексте является подпунктом размещенной среды.

Это означает:

  • Если ваша программа работает в среде без хоста (ваша программа представляет собой встроенную систему или операционную систему), она может иметь любой тип возврата. void main() наиболее распространен.

  • Если ваша программа запущена в размещенной среде (поверх ОС), main() должен возвращать int и может иметь дополнительные параметры.

Ответ 2

Lundin корректен относительно C, но в С++ формулировка достаточно различна, чтобы иметь значение:

[C++11: 3.6.1/1]: Программа должна содержать глобальную функцию с именем main, которая является назначенным началом программы. Определяется реализацией, требуется ли программа в автономной среде для определения функции main.

[C++11: 3.6.1/2]: Реализация не должна предопределять функцию main. Эта функция не должна быть перегружена. Он должен иметь тип возвращаемого типа int, но в противном случае его тип определяется реализацией [..]

Первый полужирный проход не отменяет или не отменяет второй.

main всегда возвращает int в С++.

Ответ 3

Тип возврата для main определяется реализацией, а не программистом. Проверьте свою документацию компилятора, чтобы узнать, что означает легальные подписи для main. Не предполагайте, что void main() является одним из них. В размещенной среде main обычно возвращает int. В среде freestandaing точка входа может даже не быть названа main, но ее тип возврата будет по-прежнему определяться реализацией, а не программистом.

Ответ 4

Есть 3 ситуации:

  • свободная реализация
  • Соответствие размещенной версии без расширений
  • размещенная реализация с расширениями

В 1. не обязательно должна быть функция с именем main. Реализация определяет, как запускается программа.

В 2. программа запускает выполнение с помощью функции с именем main, определенной одной из следующих 2-х подписи: int main(void) или int main(int argc, char **argv)

В 3. программа запускается с функцией с именем main, определяемой как разрешенная реализацией. Эта функция должна возвращать int для стандартного соответствия. Например: int main(int argc, char **argv, char **envp) или int main(wchar_t**). Обратите внимание, что программы, которые используют эти формы, необязательно действительны во всех размещенных реализациях (и могут стать недействительными для исходного автора, если реализация изменится).

Ответ 5

Первоначально на языке C не было такого типа, как void, и поэтому функция должна была возвращать int.

На практике возвращение int позволяет вам запускать другой процесс из вашего процесса (используя fork и exec), и если вы можете получить результат возврата из этого процесса, вы узнаете, работает он или нет.

Ответ 6

Многие компиляторы не поддерживают void main(), поэтому вы всегда должны использовать int main().