Spec-Zone.ru › C

Основная функция

В каждом 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)

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2023):
    • 5.1.2.2.1 Запуск программы (cтр: TBD)
  • Стандарт C17 (ISO/IEC 9899:2018):
    • 5.1.2.2.1 Запуск программы (cтр: 10-11)
  • Стандарт C11 (ISO/IEC 9899:2011):
    • 5.1.2.2.1 Запуск программы (cтр: 13)
  • Стандарт C99 (ISO/IEC 9899:1999):
    • 5.1.2.2.1 Запуск программы (cтр: 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/w/c/language/main_function

Spec-Zone.ru

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