我在 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/