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 переменные, где инициализация происходит при первом использовании (вроде), вы ошиблись.

Другие вопросы по тегам