命名空间作用域变量的c++初始化
C++ initialization of namespace scope variable
考虑以下程序:(参见这里的实时演示)
#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),你错了。
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 复制列表初始化的隐式转换的等级是多少
- 内联映射初始化的动态atexit析构函数崩溃
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 没有用于初始化C++中的变量模板的匹配构造函数
- 在未初始化映射的情况下,将值插入到映射的映射中
- C++成员初始化
- 为什么在C++中首先初始化成员类
- 同时具有"聚合初始化"和"模板推导"
- 初始化具有非默认构造函数的std::数组项的更好方法
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 在C和C++中初始化结构中的数组
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 在函数内部的声明中初始化数组,并在外部使用它
- 继承:构造函数,初始化C++11中基类的类C数组成员