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

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

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

6 ответов

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

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

5.1.2.1 Отдельно стоящая среда

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

5.1.2.2 Хостинговая среда

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. свободностоящая реализация
  2. соответствующая размещенная реализация без расширений
  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**), Обратите внимание, что программы, использующие эти формы, не обязательно действительны во всех размещенных реализациях (и могут стать недействительными для первоначального автора, если реализация изменится).

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

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

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

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