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

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

考虑以下程序:(参见现场演示 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++ 文件中的变量从上到下初始化。所以 md 之后被初始化。

还有一些其他的微妙之处。

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

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

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

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

关于命名空间范围变量的 C++ 初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32809274/

相关文章:

c++ - C++中 vector 初始化的性能

global-variables - 如何在多个 Octave 音阶脚本之间共享全局变量?

javascript - 为什么 undefined var 没有添加到 window 对象 JavaScript 中?

c++ - 这个右移是如何工作的 : stringstream >> unsigned int >> unsigned int?

c++ - 在编译时防止 header 包含在某些文件中?

c++ - 以逗号分隔的表达式调用析构函数

c - C 数组的范围初始化

C++ for循环变量的生命周期很奇怪

c++ - 加密我的 C++ 应用程序发送和接收的数据?

c - 将非常量变量保存在 ARM 设备上的 ROM 中