Namespaces
Variants

Main function

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

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

int main() { тело функции } (1)
int main( int argc , char * argv [] ) { тело функции } (2)
int main( /* implementation-defined */ ) { тело функции } (3)
1) Функция main , работающая независимо от аргументов, предоставляемых средой.
2) Функция main , принимающая аргументы, предоставляемые средой выполнения.
Имена argc и argv являются произвольными, так же как и представление типов параметров: int main ( int ac, char ** av ) также является допустимым.
3) Функция main с типом, определяемым реализацией, возвращающая int .
Стандарт C++ рекомендует, чтобы определяемые реализацией main функции размещали дополнительные (необязательные) параметры после argv .
argc - Неотрицательное значение, представляющее количество аргументов, переданных программе из среды выполнения.
argv - Указатель на первый элемент массива из argc + 1 указателей, последний из которых является нулевым, а предыдущие (если есть) указывают на строки с нулевым завершителем , которые представляют аргументы, переданные программе из среды выполнения. Если argv [ 0 ] не является нулевым указателем (или, что эквивалентно, если argc > 0 ), он указывает на строку, представляющую имя, использованное для запуска программы, или на пустую строку.
body - Тело функции main .

Содержание

Объяснение

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

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

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

1) Тело функции main не обязательно должно содержать оператор return statement : если управление достигает конца main без встречи с оператором return, эффект эквивалентен выполнению return 0 ; .
2) Выполнение оператора return (или неявного возврата при достижении конца функции main ) эквивалентно сначала нормальному выходу из функции (что уничтожает объекты с автоматической продолжительностью хранения и вычисляет любые постусловия функции main (since C++26) ), а затем вызову std::exit с тем же аргументом, что и аргумент оператора return ( std::exit затем уничтожает статические объекты и завершает программу).

Функция main имеет несколько ограничений (нарушение которых делает программу некорректной):

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

Примечания

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

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

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

Пример

Демонстрирует, как сообщить программе, где найти входные данные и куда записывать результаты.
Возможный вызов: . / 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++23 (ISO/IEC 14882:2024):
  • 6.9.3.1 Функция main [basic.start.main]

Отчеты о дефектах

Следующие отчеты об изменениях в поведении, являющиеся дефектными, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применяется к Поведение в опубликованной версии Корректное поведение
CWG 1003 C++98 поддерживаемые имена параметров main были излишне ограничены поддерживаются все допустимые имена
параметров
CWG 1886 C++98 функция main могла быть объявлена с языковой линковкой запрещено
CWG 2479 C++20 функция main могла быть объявлена consteval запрещено
CWG 2811 C++98 неясно, используется ли функция main после N3214 считается используемой при упоминании по имени

Смотрите также

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