C++ инициализация переменной области имен пространства
Рассмотрите следующую программу: (см. Живую демонстрацию здесь.)
#include <iostream>
inline double fun()
{
return 3.0;
}
extern double m;
double d2=m;
int main()
{
std::cout<<d2;
}
double m=fun();
Я ожидал получить вывод программы как 3.0, но он дает мне вывод 0. Почему?
Похоже, переменная d2 инициализируется статически?
Разве это не должно быть инициализировано динамически?
Я протестировал его на g++ 4.8.1, 4.9.2 и MSVS 2010 и получил 0 в качестве вывода.
2 ответа
Переменные в пределах C++
файл инициализируется сверху вниз. Так m
инициализируется после d
,
Есть и другие тонкости.
Когда компилятор может это решить, он иногда выдает определения данных для переменных, устанавливая значение для известной константы. Это происходит до загрузки программы.
Тогда порядок инициализации кода сегментов - как конструкторы. Эти сегменты встречаются сверху вниз в модуле компиляции.
В твоем случае d=m
Я думаю, что копирует значение из слота для м. Который установлен на 0,0
затем m=fun()
вызывается, копируя слот с правильным значением.
Да, оба d2
а также m
имеют статическую длительность хранения, потому что они объявлены как недекорированные в области имен.
Это означает, что они инициализируются нулями в качестве первого шага перед любой другой инициализацией. Затем, d2
установлен в m
, Только после этого m
становится 3.0
,
Рассмотрим следующее, что по сути одно и то же:
int main()
{
int x = 0, y = 0;
y = x;
x = 3;
}
Понятно, что здесь глупости ожидать y
быть равным 3
Но это то, что вы делаете.
Если вы ожидали, что инициализация произойдет, как для функцииstatic
переменные, где инициализация происходит при первом использовании (вроде), вы ошиблись.