什么原因导致TU被包含在编译中?

时间:2012-01-17 10:52:49

标签: c++ visual-c++ compiler-construction macros visual-studio-2010

我有点超出我的深度,我会说实话。

我正在做一些相当好奇的实验,让前主函数通过匿名命名空间在工厂中注册我的类。直到最近,将以下内容添加到类定义(.cpp)才能解决问题。

namespace { int x = Register<classType>(className); }

这将包含在一个宏中,“Register”会将类型和名称传递给我的工厂。

这很好用,包含这个宏的每个类都已注册,直到我将代码移动到静态库中。现在,因为类只是由工厂引用,看起来它们在构建中被省略 - 我的'Register'函数不再被调用,所以我的工厂是空的。

我已经设法通过将所有宏移动到管理器对象的构造函数来解决这个问题,但我注意到,只要我在那里引用它们,.cpp文件中的宏就会再次被调用。我猜想因为现在这些类实际上被某些东西引用了。

但是,我真的不想这样做,我似乎无法找到一种非提交方式来引用构造函数中的类(例如class ClassToRegister;),它们在构建中包含它们,这样我的寄存器宏就会被调用。

首先,这有意义吗?

其次,关于如何强制这些TU进行编译以便匿名命名空间在运行时“启动”的任何建议?

3 个答案:

答案 0 :(得分:1)

看来这是使用静态库的一部分;如果没有链接器voodoo,未使用的代码将无法通过。

答案 1 :(得分:0)

静态库是一堆目标文件,你给链接器说“嘿,在这里找到我没有在别处定义的东西”。因此,如果库中的给定目标文件未填充依赖项,则无法在不依赖链接器的其他功能的情况下将其包含在程序中(例如,某些链接器可以包含所有目标文件静态库而不仅仅是填充依赖项的人。)

答案 2 :(得分:-1)

很可能你是积极优化的受害者,但有一个原因:由于你没有在无名空间中使用对象,编译器会删除它们。

你可以尝试这样解决:

namespace foo
{
namespace{
MACRO_TO_DEFINE_VARIABLE( MyClass ); // define a variable named registrationObj
};

MyClass::MyClass()
{
  (void)registrationObj;
}
}