das*_*esy 0 c++ namespaces initialization shared-libraries
我想在共享库中初始化一些查找表,我想看看这是否是一种有效的方式,如果它继续在更多的库中使用它我将要编写.
typedef std::map<std::string, int> NAME_LUT;
NAME_LUT g_mLUT;
namespace
{
bool OneTimeInit()
{
::g_mLUT.insert(NAME_LUT::value_type("open", 1));
::g_mLUT.insert(NAME_LUT::value_type("close", 2));
return true;
}
bool bInit = OneTimeInit(); // Just to make initialization happen
}
Run Code Online (Sandbox Code Playgroud)
它似乎在Visual Studio和gcc(Linux)上都能正常工作.只有gcc抱怨bInit没有在任何地方使用.
bInit未使用),或语言不允许(由于副作用).OneTimeInit声明静态是否有意义?(即使用static bool OneTimeInit() {...}),或单独使用命名空间是使其成为此编译单元唯一的更好方法我不太喜欢使用静态存储的变量的想法,但是如果你打算这样做,你可以通过编写一个初始化你的对象的函数来实际简化代码:
typedef std::map<std::string, int> NAME_LUT;
namespace {
NAME_LUT create_lut() {
NAME_LUT table;
table.insert(NAME_LUT::value_type("open", 1));
table.insert(NAME_LUT::value_type("close", 2));
return table;
}
}
NAME_LUT g_mLut = create_lut();
Run Code Online (Sandbox Code Playgroud)
请注意,这具有所有常见的初始化顺序问题(跨越不同的翻译单元,特别是与动态库)