close
Пространства имён
Варианты
Действия

Функция main

Материал из cppreference.com

Каждая программа на 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 обозначают "количество аргументов" и "вектор аргументов", однако для этих параметров можно выбрать другие имена, а также другие эквивалентные объявления их типов: int main(int ac, char** av) также допустимо.

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

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

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

Объяснение

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

Параметры формы функции 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)

Ссылки

  • Стандарт 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