Namespaces
Variants

Main function

From cppreference.net

Каждая программа на C, написанная для работы в размещенной среде выполнения, содержит определение (не прототип) функции с именем main , которая является обозначенной точкой входа программы.

int main (void) { тело_функции } (1)
int main ( int argc , char * argv [ ] ) { тело_функции } (2)
/* другая определяемая реализацией сигнатура */ (начиная с C99) (3)

Содержание

Параметры

argc - Неотрицательное значение, представляющее количество аргументов, переданных программе из среды выполнения.
argv - Указатель на первый элемент массива из argc + 1 указателей, последний из которых является нулевым, а предыдущие (при их наличии) указывают на строки, представляющие аргументы, переданные программе из среды выполнения. Если argv [ 0 ] не является нулевым указателем (или, что эквивалентно, если argc > 0), он указывает на строку, представляющую имя программы, которая пуста, если имя программы недоступно из среды выполнения.

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

Распространённая реализационно-определённая форма main — это int main ( int argc, char * argv [ ] , char * envp [ ] ) , где добавляется третий аргумент типа char ** , указывающий на массив указателей на переменные окружения выполнения .

Возвращаемое значение

Если используется оператор return, возвращаемое значение используется в качестве аргумента для неявного вызова exit() (подробности см. ниже). Значения ноль и EXIT_SUCCESS указывают на успешное завершение, значение EXIT_FAILURE указывает на неуспешное завершение.

Объяснение

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

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

Если хостовая среда не может предоставить как строчные, так и прописные буквы, аргументы командной строки преобразуются в строчные.

Строки являются изменяемыми, и любые внесённые изменения сохраняются до завершения программы, хотя эти изменения не передаются обратно в окружение хоста: их можно использовать, например, с strtok .

Размер массива, на который указывает argv , составляет как минимум argc+1 , и последний элемент, argv[argc] , гарантированно является нулевым указателем.

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

1) Программа не может предоставить прототип для этой функции.
2) Если возвращаемый тип функции main совместим с int , то возврат из первоначального вызова main (но не возврат из любого последующего рекурсивного вызова) эквивалентен выполнению функции exit , где значение, возвращаемое функцией main, передаётся в качестве аргумента (что затем вызывает функции, зарегистрированные с помощью atexit , сбрасывает и закрывает все потоки, удаляет файлы, созданные с помощью tmpfile , и возвращает управление среде выполнения).
3)

Если функция main выполняет return без указания значения или, что то же самое, достигает завершающей } без выполнения return , статус завершения, возвращаемый в хост-среду, не определён.

(до C99)

Если возвращаемый тип функции main не совместим с int (например, void main ( void ) ), значение, возвращаемое в хост-среду, не специфицировано. Если возвращаемый тип совместим с int и управление достигает завершающей } , значение, возвращаемое в среду, такое же, как при выполнении return 0 ; .

(начиная с C99)

Пример

Демонстрирует, как сообщить программе, где найти входные данные и куда записывать результаты. Вызов: ./a.out indatafile outdatafile

#include <stdio.h>
int main(int argc, char *argv[])
{
    printf("argc = %d\n", argc);
    for (int ndx = 0; ndx != argc; ++ndx)
        printf("argv[%d] --> %s\n", ndx, argv[ndx]);
    printf("argv[argc] = %p\n", (void*)argv[argc]);
}

Возможный вывод:

argc = 3
argv[0] --> ./a.out
argv[1] --> indatafile
argv[2] --> outdatafile
argv[argc] = (nil)

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
  • 5.1.2.2.1 Запуск программы (стр.: TBD)
  • Стандарт C17 (ISO/IEC 9899:2018):
  • 5.1.2.2.1 Запуск программы (стр: 10-11)
  • Стандарт C11 (ISO/IEC 9899:2011):
  • 5.1.2.2.1 Запуск программы (стр: 13)
  • Стандарт C99 (ISO/IEC 9899:1999):
  • 5.1.2.2.1 Запуск программы (стр: 12)
  • Стандарт C89/C90 (ISO/IEC 9899:1990):
  • 5.1.2.2 Хост-среда

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

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