【问题标题】:What causes a TU to be included in compilation?是什么导致 TU 被包含在编译中?
【发布时间】:2012-01-17 10:52:49
【问题描述】:

老实说,我在这里有点超出我的深度。

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

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

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

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

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

但是,我真的不想这样做,而且我似乎找不到在构造函数中引用类的非承诺方式(例如class ClassToRegister;),它将它们包含在构建中,所以我的注册宏将被调用。

首先,这有意义吗?

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

【问题讨论】:

  • (a) 向我们展示您是如何构建静态库的? (b) 阅读[静态初始化顺序惨败](解决这个问题)
  • TU: en.wikipedia.org/wiki/Translation_unit_(programming) - 在这种情况下,它是一个由 .h 和 .cpp 文件表示的类。我怀疑这是 IOF 的产物,是的。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      你可以尝试这样绕过:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-28
        • 1970-01-01
        • 2019-10-31
        • 1970-01-01
        • 2016-11-13
        • 2019-05-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多