c++ - 防止跳过静态变量初始化

标签 c++ static initialization

我在 gcc4.8 上编译时遇到了一个讨厌的错误,其要点如下:

#include <iostream>

//time_span.h
struct time_span_t
{
    static time_span_t end;

    time_span_t(int seconds_) : seconds(seconds_) { }

    time_span_t& operator+=(const time_span_t& rhs)
    {
        seconds += rhs.seconds;
        return (*this);
    }

    int seconds;
};

//foo.h
struct foo_t
{
    static time_span_t bar;
};

//order of static initialization unreliable!
//{

//foo.cpp
time_span_t foo_t::bar = time_span_t::end;

//time_span.cpp
time_span_t time_span_t::end = time_span_t(100000);

//}

//main.cpp
int main()
{
    time_span_t test = time_span_t(10);
    test += foo_t::bar;

    std::cout << test.seconds << std::endl; //prints 10
}

问题是 foo_t::bar 有时会未初始化。在我试过的大多数编译器上,变量在使用前已正确初始化。

所以我的问题是是否有一种标准方法来防止此类问题?提前致谢。

最佳答案

可执行文件中包含的所有全局变量都将在输入 main() 之前初始化。访问未初始化全局变量的唯一方法是在初始化另一个全局变量时访问它。使用翻译单元,可以很容易地避免访问未初始化的全局变量,方法是首先列出在 other 初始化期间访问的变量。然而,翻译单元之间的初始化顺序是不确定的。

关于c++ - 防止跳过静态变量初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20574475/

相关文章:

c++ - 插入 map

java - 检查 jdk/JRE 是否已安装并获取 jvm.dll 的路径

java - 静态变量、模式和 Android 性能

c++ - 如何静态初始化包含 union 的结构数组?

variables - `tf.random_normal` 和 `tf.random_normal_initializer` 有什么区别?

c++ - 使用 TransparentBlt

c++ - 如何捕获 Windows 窗体按钮的鼠标悬停事件

java - 为什么子类的静态代码会被执行?

html - CSS 问题,位置 : absolute

c - 初始化结构体的字段