logo
volkov / C++ / Бьерн Страуструп-Справочное руководство по С++

R.3.4 Начало и окончание программы

Программа должна содержать функцию с именем main(). Ей приписывается

роль начала программы. Эта функция не является предопределенной

для транслятора, она не может быть перегружена, а ее тип зависит

от реализации. Предполагается, что любая реализация должна

допускать два приведенных ниже определения и что можно добавлять

после argv любые параметры. Функция main может определяться так

int main() { /* ... */ }

или

int main(int argc, char* argv[]) { /* ... */ }

В последнем определении argc задает число параметров, передаваемых

программе окружением, в котором она выполняется. Если argc не

равно нулю, параметры должны передаваться как строки, завершающиеся

символом '\0', с помощью argv[0] до argv[argc-1], причем

argv[0] должно быть именем, под которым программа была запущена,

или "". Должно гарантироваться, что argv[argc]==0.

Функция main() не должна вызываться в программе. Связывание

main() ($$R.3.3) зависит от реализации. Нельзя получать адрес

main() и не следует описывать ее как inline или static.

Вызов функции

void exit(int);

описанной в <stdlib.h>, завершает программу. Значение параметра

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

Инициализация нелокальных статических объектов ($$R.3.5)

единицы трансляции происходит прежде первого обращения к функции

или объекту, определенному в этой единице трансляции. Эта

инициализация ($$R.8.4, $$R.9.4, &&R.12.1, $$R.12.6.1) может

быть проведена перед выполнением первого оператора main() или

отложена до любого момента, предшествующего первому использованию

функции или объекта, определенных в данной единице трансляции.

Все статические объекты по умолчанию инициализируются нулем ($$R.8.4)

прежде любой динамической (во времени выполнения программы)

инициализации. Больше никаких требований на порядок инициализации

объектов из различных единиц трансляции не налагается. Инициализация

локальных и статических объектов описана в $$R.8.4.

Деструкторы ($$R.12.4) для инициализированных статических

объектов вызываются при возврате из main() или при вызове exit().

Уничтожение происходит в обратном порядке по сравнению с

инициализацией. С помощью функции atexit() из <stdlib.h> можно

указать функцию, которую нужно вызывать при выходе из программы.

Если было обращение к функции atexit(), объекты, инициализированные

до вызова atexit(), не должны уничтожаться до тех пор, пока не

произойдет вызов функции, указанной в atexit(). Если реализация С++

сосуществует с реализацией С, все действия, которые должны были

произойти после вызова функции, заданной в atexit(), происходят

только после вызова всех деструкторов.

Вызов функции

void abort();

описанной в <stdlib.h>, завершает программу без выполнения

деструкторов статических объектов и без вызова функций, заданных

в atexit().