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

Функция main()

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

Программа должна иметь глобальную функцию main — точку старта программы.

int main () { body } (1)
int main (int argc, char *argv[]) { body } (2)
int main (int argc, char *argv[] , other_parameters ) { body } (3)
argc Неотрицательное число — количество аргументов, переданных программе из окружения, в котором запустили программу.
argv Указатель на первый элемент массива указателей на многобайтовые строки с завершающим нулем, аргументы, переданных программе из окружения, в котором запустили программу (с argv[0] по argv[argc-1]). Гарантируется, что последний элемент массива argv[argc] — нулевой указатель 0.
body Тело функции main.
other_parameters Различные реализации допускают дополнительные формы функции main, но при этом возвращаемый тип всегда int. Наиболее часто третьим аргументом передают массив char*[] указателей на значения переменных окружения.

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

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

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

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

Функция 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) Если функция main определена как function-try-block, исключения, брошенные деструкторами статических объектов (которые уничтожаются при вызове std::exit), не отлавливаются функцией.
7) (начиная с C++14) Тип возвращаемого значения функцией main не может быть выведен (auto main() {...} не разрешён).

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

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

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

Справка по CФункция main