Spec-Zone.ru › C

Функция main

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

int main (void) { body } (1)
int main (int argc, char *argv[]) { body } (2)
/* another implementation-defined signature */ (since C99) (3)

Параметры

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

Имена argc и argv означают «количество аргументов» и «вектор аргументов» и традиционно используются, однако для параметров можно выбрать и другие имена, а также другие, но эквивалентные объявления их типов: intmain(intac,char**av) также является допустимым.

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

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

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

Пояснение

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

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

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

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

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

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

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

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

(до C99)

Если тип возвращаемого значения главной функции не совместим с 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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/language/main_function

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API