我看着一段创建全局类变量的代码。这些类的构造函数调用符号表单例并在其中添加此指针..
在Keywords.cpp文件中
class A : class KeyWord
{
A() { add(); }
} A def;
类似于关键字B,C等
void KeyWord::add()
{
CSymbolCtrl& c = CSymbolCtrl::GetInstance();
c.addToTable(this);
}
编译这些翻译单元以形成库。当我“dumpbin”库时,我会看到ADef,BDef等的动态初始化器。
在exe中没有,当我调用CSymbolCtrl实例时,我没有找到存储在其地图中的ADef,BDef ..当我在add()中设置断点时,它没有被击中。是否存在链接器忽略ADef,BDef的方式,因为它们没有在任何地方引用?
}
答案 0 :(得分:3)
来自标准文档 1.9程序执行,
4)这项规定有时被称为“假设”规则,因为实施可以自由地忽视本国际标准的任何要求 只要结果好像符合要求,只要可以从程序的可观察行为中确定。例如, 实际的实现不需要评估表达式的一部分,如果它可以推断出它的值没有被使用,并且没有副作用影响 产生了可观察的程序行为。
所以,可能,是的。
答案 1 :(得分:1)
简短的回答是肯定的。强制注册的一种非常常见的方法是执行以下操作:
static bool foo = register_type();
答案 2 :(得分:1)
你的问题不太清楚,但实际上是你 包括链接中的编译对象文件?只是 将文件放入库中不会导致它被包含在内 最后的节目。根据定义,库中的文件将 只有在解析未解决的情况下才会包含在可执行文件中 外部符号。如果你想要一个目标文件的一部分 最终的可执行文件,它不包含任何全局变量 解决一个未定义的外部,然后你有几个选择:
- 直接链接目标文件,而不是将其放入 图书馆。 (这是“标准”或“规范”的方式 这样做。)
- 使用DLL。暂不说名字,DLL不是库,但是 目标文件,并以全有或全无的方式链接。
- 创建一个虚拟全局符号,并在某处引用它。 (这通常可以自动化,可能是首选 解决方案,如果您作为第三方提供图书馆 供应商。)