我想在一个共享库中初始化一些查找表,我想看看这是否是一种有效的方式,如果它继续在我即将编写的更多库中使用它。
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
}
它似乎在 Visual Studio 和 gcc (Linux) 上都能正常工作。只有 gcc 抱怨bInit
没有在任何地方使用。
- 初始化是否可能被优化(
bInit
未使用),或者语言不允许它(因为副作用)。 - 它看起来确实是处理一次性初始化的一种很好的跨平台方式,但我不确定这是否是最好的方法。
OneTimeInit
声明为静态有意义吗?(即 usestatic bool OneTimeInit() {...}
),或单独命名空间是使其对这个编译单元唯一的更好方法