考虑以下程序:(参见现场演示 here.)
#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()
被调用,用正确的值复制槽。
关于命名空间范围变量的 C++ 初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32809274/