命名空间作用域变量的c++初始化

C++ initialization of namespace scope variable

本文关键字:c++ 初始化 变量 作用域 命名空间      更新时间:2023-10-16

考虑以下程序:(参见这里的实时演示)

#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++文件中的变量从上到下初始化。因此md之后初始化。

还有其他一些微妙之处。

当编译器可以解决这个问题时,它有时会发出变量的数据定义-将值设置为已知常数。这些在程序加载之前发生。

则初始化顺序为代码段式构造函数。这些段在编译单元中从上到下出现。

在您的情况下,d=m我认为从槽中复制m的值。设置为0.0

然后调用m=fun(),用正确的值复制槽位

是的,d2m都有静态存储持续时间,因为它们是在命名空间范围内声明的,未修饰的。

这意味着它们是零初始化作为任何其他初始化发生之前的第一步。将"d2"设置为"m"。直到之后,m才变成3.0

考虑以下内容,它们本质上是相同的:

int main()
{
   int x = 0, y = 0;
   y = x;
   x = 3;
}

显然,在这里,期望y等于3是无稽之谈,但这就是你正在做的。

如果您期望初始化发生在函数- static变量,其中初始化发生在第一次使用(sort of),你错了。