Этот код создает неопределенное поведение, или это просто неопределенное поведение? - PullRequest
6 голосов
/ 13 мая 2011

Допустим, у нас есть две единицы компиляции:

// a.cpp
extern int value2;
int value1 = value2 + 10;

// b.cpp
extern int value1;
int value2 = value1 + 10;

Когда я попробовал его на VC2010, он сначала инициализирует value1 и value2 нулями. value1 и value2 не инициализируются динамически, и инициализация по умолчанию к ним не применяется?

Спасибо

Ответы [ 2 ]

8 голосов
/ 13 мая 2011

3.6.2 / 1 говорит, что «Объекты со статической продолжительностью хранения (3.7.1) должны быть инициализированы нулями (8.5), прежде чем произойдет любая другая инициализация».

Так что вы правы, они не инициализируются по умолчанию. Но они инициализируются нулями, что на самом деле для int это то же самое. Для типа класса это не обязательно одно и то же.

Тем не менее, я не обещаю, что поведение здесь просто в том, что порядок инициализации не определен, и, следовательно, одна переменная заканчивается как 10, а другая 20, но не определена, которая есть какая. Это может быть неопределенным по некоторым другим причинам, но я не могу думать ни о чем.

3 голосов
/ 13 мая 2011

Каждая глобальная переменная сначала инициализируется нулями, прежде чем произойдут все остальные инициализации.
Это поведение описано в разделе 3.6.2 [basic.start.init] / 2:

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

(Это из C ++ 0x FDIS, но я считаю, что стандарт C ++ 98 говорит то же самое.)

...