Main function
Программа должна содержать функцию глобального пространства имен с именем main , которая является обозначенной точкой входа программы в hosted environment. Она должна иметь одну из следующих форм:
int
main() {
тело функции
}
|
(1) | ||||||||
int
main(
int
argc
,
char
*
argv
[]
) {
тело функции
}
|
(2) | ||||||||
int
main(
/* implementation-defined */
) {
тело функции
}
|
(3) | ||||||||
main
, работающая независимо от аргументов, предоставляемых средой.
main
, принимающая аргументы, предоставляемые средой выполнения.
main
с типом, определяемым реализацией, возвращающая
int
.
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
обладает следующими особыми свойствами:
main
не обязательно должно содержать оператор
return
statement
: если управление достигает конца
main
без встречи с оператором return, эффект эквивалентен выполнению
return
0
;
.
main
) эквивалентно сначала нормальному выходу из функции (что уничтожает объекты с автоматической продолжительностью хранения
и вычисляет любые
постусловия
функции
main
(since C++26)
), а затем вызову
std::exit
с тем же аргументом, что и аргумент оператора
return
(
std::exit
затем уничтожает статические объекты и завершает программу).
Функция
main
имеет несколько ограничений (нарушение которых делает программу некорректной):
main
в глобальном пространстве имён зарезервировано для функций (хотя оно может использоваться для именования классов, пространств имён, перечислений и любых сущностей в неглобальном пространстве имён, за исключением того, что сущность с именем
main
не может быть объявлена с
языковой привязкой C
в любом пространстве имён).
constexpr
(since C++11)
,
consteval
(since C++20)
,
inline
, или
static
.
|
4)
Тип возвращаемого значения функции
main
не может быть выведен (
auto
main
(
)
{
...
}
не допускается).
|
(начиная с C++14) |
| (начиная с 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++.
| 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
функции
|