通常,当我尝试初始化静态变量时
class Test2 {
public:
static vector<string> stringList;
private:
static bool __init;
static bool init() {
stringList.push_back("string1");
stringList.push_back("string2");
stringList.push_back("string3");
return true;
}
};
// Implement
vector<string> Test2::stringList;
bool Test2::__init = Test2::init();
Run Code Online (Sandbox Code Playgroud)
虽然初始化应该在main函数之前发生(因此,没有线程可以同时访问init),我关心的是:
我使用的是Windows XP,VC6和VC2008编译器.
在静态变量初始化期间,以下代码线程是否安全?
这完全取决于您的编译器.该标准绝对没有关于多线程的说法.
有没有更好的方法来静态初始化stringlist,而不是使用单独的静态函数(init)?
首先,你需要删除名称前面的__s(那是两个下划线); 任何以__开头的名称都是根据标准保留的.(在某些情况下,也不允许使用单个下划线 - 最好只是避免在名称上引入下划线)
这完全取决于向量是否需要在运行时更改.如果没有,你可能只是使用内置数组:
static const char *strings[] = {
"string1",
"string2",
"string3"
};
Run Code Online (Sandbox Code Playgroud)