我正在尝试初始化全局地图
std::map<long, std::string> Global_ID_Mapper;
有许多“init”类,例如:
struct AGlobalMapperInitializer
{
AGlobalMapperInitializer()
{
Global_ID_Mapper.insert( std::make_pair(1, "Value1") );
Global_ID_Mapper.insert( std::make_pair(2, "Value2") );
}
};
我想在应用程序启动时自动填充地图。因此,在我的一个 cpp 文件中,我只定义了该“init”类的一个全局变量。
// AGlobalMapperInitializer.cpp
AGlobalMapperInitializer AGlobalMapperInitializer_Value;
Mapper 填充是一个副作用AGlobalMapperInitializer_Value
创建。
问题是,如果 cpp 除了这个全局变量之外不包含任何内容,那么链接器显然会忽略 cpp。当我将一些有用的其他代码放入 cpp 中(或在某些非空 cpp 中定义全局初始值设定项)时,将调用构造函数并填充全局映射器。但是,如果 cpp 仅包含未在其他文件中引用的全局变量,则 cpp 会被编译,obj 文件包含该变量,但链接器在链接期间不会提及它,并且在 exe 中会丢失该变量。
我怎样才能坚持将cpp链接到exe中?
是否有一些编译指示或虚拟代码可以放入 cpp 中以使其不被忽略?
我使用的是 Visual Studio 2012。
C++ 不需要初始化全局变量x
如果同一文件(实际上是翻译单元)中没有函数或变量,则发生x
曾经被引用过。
参见 C++11[basic.start.init]§4
:
具有静态存储持续时间的非局部变量的动态初始化是否在第一个语句之前完成是实现定义的main
。如果初始化被推迟到第一个语句之后的某个时间点main
,它应发生在与要初始化的变量相同的翻译单元中定义的任何函数或变量的第一次 odr-use (3.2) 之前。
因此,要强制变量初始化,您必须将其放入实际使用其其他内容的文件中,或者直接在某处使用该变量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)