Пространства имён
Варианты
Действия

Функция main()

Материал из cppreference.com
< cpp‎ | language
 
 
 
 

Программа должна иметь глобальную функцию main, которая является точкой старта программы. Она должна иметь одну из следующих форм:

int main () { тело } (1)
int main (int argc, char *argv[]) { тело } (2)
/* другая, определённая реализацией форма, с int, в качестве возвращаемого типа */ (3)
argc Неотрицательное число, представляющее количество аргументов, переданных программе из окружения, в котором запустили программу.
argv Указатель на первый элемент массива argc + 1 указателей, последний из которых равен null, а предыдущие, если существуют, указывают на многобайтовые строки с завершающим нулём, которые представляют аргументы, переданные программе из окружения, в котором её запустили. Если argv[0] не пустой указатель (или, что тоже самое, argc > 0), он указывает на строку, которая представляет имя, использованное при запуске программы, или пустую строку.


тело Тело функции main.

Имена argc и argv могут быть произвольными, так же как и запись типов этих параметров: int main(int ac, char** av) так же допустимо.

Самая распространённая форма main(), определённая реализацией, имеет третий аргумент (дополнительно к argc и argv), типа char*[], указывающий на массив указателей на переменные среды выполнения.

[править] Объяснение

Функция main вызывается при старте программы после инициализации нелокальных объектов со статическим классом памяти. Это точка входа в программу, которая исполняется в гостевом окружении (то есть с операционной системой). Точки входа в автономные программы (загрузчики, ядра ОС, и т.п.) зависят от реализации.

Параметры функции main в варианте с двумя параметрами позволяют передать произвольные многобайтовые строки из среды выполнения (обычно известных как аргументы командной строки), указатели argv[1] .. argv[argc-1] ссылаются на первые символы этих строк. argv[0] это указатель на первый символ многобайтовой строки с завершающим нулём, которая содержит имя, используемое при вызове программы (или пустую строку "", если это не поддерживается средой выполнения). Эти строки изменяемые, хотя их изменения не распространяются назад в среду выполнения: они могут использоваться, например, в std::strtok. Размер массива, на который указывает argv, равен, по меньшей мере, argc+1, и последний элемент массива argv[argc] гарантированно является пустым указателем.

Функция main обладает следующими специальными свойствами:

1) Она нигде не может быть использована в программе,
а) в частности её нельзя вызывать рекурсивно;
б) нельзя взять её адрес.
2) Её нельзя объявлять и нельзя перегружать: фактически имя main зарезервировано в глобальном пространстве имён для функций (хотя это имя может быть использовано для именования классов, пространств имён, перечислений и любых сущностей не в глобальных пространствах имён, за исключением того, что функция с именем 'main' не может быть объявлена со связыванием для языка C в любом пространстве имён (начиная с C++17)).
3) Её нельзя объявить как удалённую или определить со связыванием для языка C (начиная с C++17), inline, static или constexpr.
4) В теле функции main не обязателен оператор return: при завершении функции main без оператора return эффект будет тот же самый, как при выполнении return 0;.
5) Выполнение return (или неявного return при достижении конца функции main) эквивалентно нормальному выходу из функции (которое уничтожает объекты с автоматическим классом памяти) с последующим вызовом std::exit с тем же самым аргументом, который был передан в return. (std::exit уничтожает статические объекты и завершает программу).
6) (начиная с C++14) Тип возвращаемого значения функцией main не может быть выведен (auto main() {...} не разрешено).

[править] Примечания

Если функция main объявлена с блоком-try-функции, исключения, брошенные деструкторами статических объектов (которые уничтожены предположительно std::exit) не будут пойманы ей.

То, как аргументы, приведенные в командной строке ОС, преобразуются в массивы многобайтовых символов, на которые ссылается argv, может включать определённую реализацией обработку:

[править] Смотрите также

Документация по Cфункция main