Функция main
Каждая программа на 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 имеет несколько специальных свойств:
int, то возврат из начального вызова main (но не возврат из любого последующего, рекурсивного вызова) эквивалентен выполнению функции exit со значением, которое возвращает функция main, переданным в качестве аргумента (который далее вызывает функции, зарегистрированные atexit, опустошает и закрывает все потоки, и удаляет файлы, созданные с помощью tmpfile, а также возвращает управление в окружение).|
Если функция main выполняет |
(до C99) |
|
Если тип возвращаемого функцией main значения не совместим с |
(начиная с 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 |