我编写了一个简单的程序,当定义了新类(例如:One,Two)时,将一个值添加到全局设置容器中:
GlobalSet.h
#include <set>
struct GlobalSet{
public:
static void* addValue(int val);
private:
static std::set<int> s;
};
GlobalSet.cpp
#include "GlobalSet.cpp"
std::set<int> GlobalSet::s;
void* GlobalSet::addValue(int val){
s.insert(val);
return NULL;
}
一小时
struct One{};
一个.cpp
#include "One.h"
#include "GlobalSet.h"
void* globalset =GlobalSet::addValue(1);
二小时
struct Two{};
二.cpp
#include "Two.h"
#include "GlobalSet.h"
void* globalset2 =GlobalSet::addValue(2);
测试文件
int main(){
return 0;
}
但是这个程序会导致段错误,这取决于gcc编译命令中的cpp顺序:
g++ GlobalSet.cpp One.cpp Two.cpp test.cpp -o test.exe //normal
g++ One.cpp Two.cpp GlobalSet.cpp test.cpp -o test.exe //segment fault!!
为什么会发生呢?如何解决该问题,使其在不关心gcc编译中的cpp顺序的情况下起作用?
欢迎使用静态初始化顺序惨败。
C ++标准不保证多个翻译单元中的全局对象的初始化顺序。
根据您的链接顺序,您的代码将globalset2
首先尝试构建。但是,这将调用静态类方法addValue()
,该方法尝试访问std::set
尚未构造的a 。
未定义的行为和崩溃。
要解决此问题,请访问www.google.com,搜索“静态初始化顺序惨败”,并继续阅读直到您理解问题为止。完成后,您将在代码中知道如何解决此问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句