我的 C 类中有一个静态 unordered_map。如果我将类定义和声明放在与包含函数 main 的文件不同的文件中,我会遇到行为差异。
问题是我观察到如果类 C 与函数 main 在同一个编译单元中,一切都很好,我只看到一次文本“创建新字符串:c”。但是,如果我将代码拆分为三个文件(参见下面的清单),我会看到两次“创建新字符串:c”,这意味着我的静态 unordered_map 在进入 main 之前就被擦除了。
我的问题是:为什么会发生这种情况?(仅在使用 Apple LLVM 编译器 4.1 进行编译时才会出现差异。我已经使用 g++4.7 -std=c++11 对其进行了测试,并且拆分代码运行良好。)
提前感谢您的任何想法!
// would go to My_header.h
#include <unordered_map>
#include <string>
#include <iostream>
using namespace std;
class C{
public:
C(const string & s);
private:
static unordered_map<string, string*> m;
string *name;
};
// would go to My_code.cpp
// (when separated, add #include "My_header.h")
unordered_map<string, string*> C::m;
C::C(const string & s):
name(NULL)
{
string*& rs = m[s];
if(rs)
{
name = rs;
}
else
{
cout<<"new string created: "<<s<<endl;
rs = name = new string(s);
}
}
// would go to main.cpp
// (when separated, add #include "My_header.h")
C c("c");
int main(int argc, const char * argv[])
{
cout << "main" << endl;
C c1("c");
}