考虑以下程序:(参见这里的实时演示)
#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作为输出
C++
文件中的变量从上到下初始化。因此m
在d
之后初始化。
还有其他一些微妙之处。
当编译器可以解决这个问题时,它有时会发出变量的数据定义-将值设置为已知常数。这些在程序加载之前发生。
则初始化顺序为代码段式构造函数。这些段在编译单元中从上到下出现。
在您的情况下,d=m
我认为从槽中复制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
变量,其中初始化发生在第一次使用(sort of),你错了。