【发布时间】: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