是什么导致TU被包括在汇编中

What causes a TU to be included in compilation?

本文关键字:汇编 包括 TU 是什么      更新时间:2023-10-16

老实说,我有点力不从心。

我正在做一些非常奇怪的实验,让pre-main函数通过匿名名称空间在工厂中注册我的类。直到最近,在类定义(.cpp)中添加以下内容就可以了。

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

这将被封装在一个宏中,"Register"将把类型和名称传递给我的工厂。

这很好,包括这个宏的每个类都被注册了,直到我把代码移到一个静态库中。现在,由于类只由工厂引用,所以看起来它们在构建中被省略了——我的"Register"函数不再被调用,所以我的工厂是空的。

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

然而,我真的不想这样做,而且我似乎找不到一种非承诺的方式来引用构造函数中的类(例如class ClassToRegister;),因为构造函数在构建中包含了这些类,所以我的寄存器宏将被调用。

首先,这有道理吗?

其次,关于如何强制这些TU进行编译,以便在运行时"启动"匿名命名空间,有什么建议吗?

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

静态库是一堆对象文件,你给链接器说"嘿,在这里找到我在其他地方没有定义的东西"。因此,如果库中给定的对象文件没有填充依赖项,那么如果不依赖链接器的其他功能,就无法将其包含在程序中(例如,一些链接器可以包含静态库的所有对象文件,而不是仅填充依赖项的对象文件)。

您很可能是激进优化的受害者,但原因是:由于您不在无名命名空间中使用对象,编译器会删除它们。

你可以试着这样四处走动:

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