C ++初始化命名空间范围变量

时间:2015-09-27 15:01:13

标签: c++ initialization global-variables unspecified-behavior

考虑以下计划:(参见现场演示here.

string str = StreamReaderTest.ReadToEnd();
str.Split(/*entry delimiter*/);

我原本希望得到程序输出为3.0,但它给出了输出0.为什么?

看起来变量d2是静态初始化的吗?

不应该动态初始化吗?

我在g ++ 4.8.1,4.9.2& MSVS 2010&获得0作为输出。

2 个答案:

答案 0 :(得分:3)

C++文件中的变量从上到下进行初始化。因此,在m之后初始化d

还有其他一些细微之处。

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

然后初始化的顺序是代码段 - 就像构造函数一样。这些段在编译单元中从上到下出现。

在你的情况下d=m我认为从插槽中复制m的值。哪个设置为0.0

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

答案 1 :(得分:1)

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

这意味着在任何其他初始化发生之前,它们是零初始化作为第一步。然后,d2设置为m。只有之后,m变为3.0

考虑以下内容,基本上是一回事:

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

显然,在这里,期望y等于3是毫无意义的,但那是你正在做的事情。

如果你期望初始化发生在函数 - static变量上,初始化在第一次使用时发生(排序),你就错了。