是什么导致TU被包括在汇编中
What causes a TU to be included in compilation?
老实说,我有点力不从心。
我正在做一些非常奇怪的实验,让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;
}
}
相关文章:
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- Windows 10-使用gtkmm-3.0库和g++[包括再现]的分段故障
- 为什么 cmake 许可证<>样式不包括?
- 计算平均值,不包括上次得分
- 从多个源构造一个对象,包括一个对象向量
- 为什么我的C++程序的程序集输出充满了 .ascii,没有汇编代码?
- 在编译中包括 Botan 2
- 在 emscripten 网页汇编正在运行期间更新进度条?
- 将值从另一个数组写入数组,不包括不需要的值 C++
- VS Code C++:不准确的系统包括路径错误(wchar.h,boost/lambda/lambda.hpp)
- 为什么我们不编写可以处理C++标识符的汇编器和链接器?
- 包括C++头文件
- CPP 包括 Azure DevOps 中的目录设置
- 在什么情况下,我想在 C/C++ 代码中使用内联汇编代码
- 包括STL,而不会乱扔全球范围
- 如何反转我的输入,包括否定
- 包括没有完整路径的我的库
- 如何在 android ndk 上链接 C 和 C++ 代码,以及 C 和 C++ 运行时库(包括 STL)?
- C++包括类名间距和类实例化
- 是什么导致TU被包括在汇编中