6 Basic concepts [basic]

6.6 Start and termination [basic.start]

6.6.1 main function [basic.start.main]

Программа должна содержать глобальную функцию с именем main. Выполнение программы запускает основной поток выполнения ([intro.multithread], [thread.threads]), в котором main вызывается функция и в котором переменные статической продолжительности хранения могут быть инициализированы ([basic.start.static]) и уничтожены ([basic.start.term]). Это определяется реализацией, требуется ли программа в автономной среде для определения main функции. [ Note: В автономной среде запуск и завершение определяются реализацией; start-up содержит выполнение конструкторов для объектов области пространства имен со статической продолжительностью хранения; завершение содержит выполнение деструкторов для объектов со статической продолжительностью хранения. ] end note

Реализация не должна предопределять main функцию. Эта функция не должна быть перегружена. Его тип должен иметь связь с языком C ++, и он должен иметь объявленный тип возвращаемого значения int, но в остальном его тип определяется реализацией. Реализация должна позволять как

  • функция () возврата int и

  • функция (int, указатель на указатель на char) возврат int

как тип main ([dcl.fct]). В последней форме, с целью демонстрации, вызывается первый параметр функции и вызывается второй параметр функции , где должно быть количество аргументов, переданных программе из среды, в которой программа выполняется. Если не равно нулю эти аргументы должны быть поставлены в счете в качестве указателей на начальные символы с завершающим нулевыми мультибайтными строками ( ntmbs с) ( ) и должны быть указателем на начальный характер ntmbs , который представляет собой имя , используемое для запуска программы или . Значение должно быть неотрицательным. Значение должно быть 0. [ Рекомендуется добавлять любые дополнительные (необязательные) параметры после . ] argc argv argc argc argv[0] argv[argc-1] [multibyte.strings] argv[0] "" argc argv[argc] Note: argv end note

Функцию main нельзя использовать в программе. Из вне реализации. Программа , которая определяет , как удаленные или что декларирует быть , или плохо сформированным. Функция не должна быть объявлена с . Программа, которая объявляет переменную в глобальной области видимости или объявляет имя с привязкой к языку C (в любом пространстве имен), имеет неправильный формат. Имя не зарезервировано. [ Функции-члены, классы и перечисления могут быть вызваны , как и сущности в других пространствах имен. ] linkage main main main inline static constexpr main linkage-specification main main main Example: main end example

Завершение программы без выхода из текущего блока (например, путем вызова функции std​::​exit(int)) не уничтожает никаких объектов с автоматической продолжительностью хранения ([class.dtor]). Если std​::​exit вызывается для завершения программы во время уничтожения объекта со статической продолжительностью хранения или продолжительностью хранения потока, программа имеет неопределенное поведение.

Оператор return in main имеет эффект выхода из основной функции (уничтожение любых объектов с автоматической продолжительностью хранения) и вызова std​::​exit с возвращаемым значением в качестве аргумента. Если управление потоками от конца compound-statementиз main, эффект эквивалентен return с операндом 0 (также см [except.handle]).