Spec-Zone.ru › C++

Основная функция

Программа должна содержать глобальную функцию, именуемую 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 обладает несколькими особыми свойствами:

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

Примечания

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

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

  • Разбор аргументов командной строки C++ MSDN
  • Введение в оболочку POSIX

Пример

Демонстрирует, как сообщить программе, где найти входные данные и где записать результаты.
Возможный вызов: ./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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API