不创建C ++全局类变量

时间:2010-11-18 09:29:12

标签: c++ global-variables

我看着一段创建全局类变量的代码。这些类的构造函数调用符号表单例并在其中添加此指针..

在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的方式,因为它们没有在任何地方引用?

}

3 个答案:

答案 0 :(得分:3)

来自标准文档 1.9程序执行

  

4)这项规定有时被称为“假设”规则,因为实施可以自由地忽视本国际标准的任何要求   只要结果好像符合要求,只要可以从程序的可观察行为中确定。例如,   实际的实现不需要评估表达式的一部分,如果它可以推断出它的值没有被使用,并且没有副作用影响   产生了可观察的程序行为。

所以,可能,是的。

答案 1 :(得分:1)

简短的回答是肯定的。强制注册的一种非常常见的方法是执行以下操作:

static bool foo = register_type();

答案 2 :(得分:1)

你的问题不太清楚,但实际上是你 包括链接中的编译对象文件?只是 将文件放入库中不会导致它被包含在内 最后的节目。根据定义,库中的文件将 只有在解析未解决的情况下才会包含在可执行文件中 外部符号。如果你想要一个目标文件的一部分 最终的可执行文件,它不包含任何全局变量 解决一个未定义的外部,然后你有几个选择:

- 直接链接目标文件,而不是将其放入     图书馆。 (这是“标准”或“规范”的方式     这样做。)

- 使用DLL。暂不说名字,DLL不是库,但是     目标文件,并以全有或全无的方式链接。

- 创建一个虚拟全局符号,并在某处引用它。     (这通常可以自动化,可能是首选     解决方案,如果您作为第三方提供图书馆     供应商。)