Основная функция
Программа должна содержать глобальную функцию, именуемую main, которая является назначенной точкой входа программы в среде выполнения. Она должна иметь один из следующих видов:
int main() { body } | (1) | |
int main(int argc, char* argv[]) { body } | (2) | |
| /* another implementation-defined form, with int as return type */ | (3) |
| argc | - | Неотрицательное значение, представляющее количество аргументов, переданных программе из среды, в которой она выполняется. |
| argv | - | Указатель на первый элемент массива из argc + 1 указателей, последний из которых равен null, а предыдущие, если таковые имеются, указывают на строки с нулевым завершением многобайтовых символов, которые представляют аргументы, переданные программе из среды выполнения. Если argv[0] не является нулевым указателем (или, что эквивалентно, если argc > 0 не равно нулю), он указывает на строку, представляющую имя, используемое для вызова программы, или на пустую строку. |
| body | - | Тело функции main. |
Имена argc и argv произвольные, а также представление типов параметров: int main(int ac, char** av) также допустимо.
Очень распространённый реализационный вид main() имеет третий аргумент (в дополнение к argc и argv), типа char**, указывающий на массив указателей на переменные среды выполнения.
Объяснение
Функция main вызывается при запуске программы после инициализации нелокальных объектов со статическим временем жизни. Она является назначенной точкой входа в программу, которая выполняется в среде выполнения (то есть, с операционной системой). Точки входа в самостоятельные программы (загрузчики, ядра ОС и т. д.) определяются реализацией.
Параметры двухпараметрического вида функции main позволяют передавать произвольные многобайтовые строки из среды выполнения (обычно их называют аргументами командной строки), указатели argv[1] .. argv[argc - 1] указывают на первые символы в каждой из этих строк. argv[0] (если не равен null) — указатель на начальный символ строки с нулевым завершением многобайтовых символов, представляющей имя, используемое для вызова самой программы (или пустая строка "" если это не поддерживается средой выполнения). Строки изменяемы, хотя эти изменения не распространяются обратно в среду выполнения: их можно использовать, например, с std::strtok. Размер массива, на который указывает argv, по меньшей мере, argc + 1, и последний элемент, argv[argc], гарантированно является нулевым указателем.
Функция main обладает несколькими особыми свойствами:
main в глобальном пространстве имён зарезервировано для функций (хотя оно может быть использовано для именования классов, пространств имён, перечислений и любых сущностей в неглобальном пространстве имён, за исключением того, что сущность с именем main не может быть объявлена с C языковым связыванием в любом пространстве имён).constexpr(с C++11), consteval(с C++20), inline или static.main без встречи с операцией возврата, эффект будет эквивалентен выполнению return 0;.std::exit с тем же аргументом, что и аргумент возврата (std::exit затем уничтожает статические объекты и завершает программу).| 6) Тип возврата функции main не может быть выведен (auto main() {...} недопустимо). | (с C++14) |
| 7) Функция main не может быть корутиной. | (с C++20) |
Примечания
Если функция main определена с блоком try-catch, исключения, сгенерированные деструкторами статических объектов (которые уничтожаются неявным std::exit), не перехватываются им.
Способ, которым аргументы, предоставленные в командной строке ОС, преобразуются в многобайтовые массивы символов, на которые ссылаются argv, может включать реализационно-зависимую обработку:
Пример
Демонстрирует, как сообщить программе, где найти входные данные и где записать результаты.
Возможный вызов: ./convert table_in.dat table_out.dat
#include <cstdlib>
#include <iomanip>
#include <iostream>
int main(int argc, char *argv[])
{
std::cout << "argc == " << argc << '\n';
for (int ndx{}; ndx != argc; ++ndx)
std::cout << "argv[" << ndx << "] == " << std::quoted(argv[ndx]) << '\n';
std::cout << "argv[" << argc << "] == "
<< static_cast<void*>(argv[argc]) << '\n';
/*...*/
return argc == 3 ? EXIT_SUCCESS : EXIT_FAILURE; // optional return value
}Возможный вывод:
argc == 3 argv[0] == "./convert" argv[1] == "table_in.dat" argv[2] == "table_out.dat" argv[3] == 0
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применено к | Поведение, опубликованное | Правильное поведение |
|---|---|---|---|
| CWG 1003 | C++98 | поддерживаемые имена параметров main были чрезмерно ограничены | поддерживаются все допустимые имена параметров |
| CWG 1886 | C++98 | функция main могла быть объявлена с языковым связыванием | запрещено |
| CWG 2479 | C++20 | функция main могла быть объявлена как consteval | запрещено |
См. также
C документация для main функции |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/language/main_function