0

假设我们有这样的方案:

qqqapi.h:

int register_qqq(Qqq* klass);

qqqalpha.cpp:

QqqAlpha::QqqAlpha(...) : Qqq(...) { }

QqqAlpha instance;
int dummy = register_qqq(&instance);

qqqbeta.cpp:

QqqBeta::QqqBeta(...) : Qqq(...) { }

QqqBeta instance;
int dummy = register_qqq(&instance);

这样,您只需复制源文件和头文件,更改适当的标识符即可创建新的 qqq 类型。无需手动将任何东西添加到任何列表中。

这种模式怎么称呼?有没有关于正确实施这些事情的建议?

4

1 回答 1

1

该方案的一个主要问题是 C++ 实现处理整个翻译单元

考虑一个包含数百个翻译单元的静态库。据编译器和链接器所知,您的程序只使用一两个。他们几乎不知道,通过在注册表对象中自动注册,您的程序实际上使用了五个单元!

因此,链接器会删除库提供的所有翻译单元,除了您的代码直接使用的一两个翻译单元,例如通过调用函数或引用变量。

结果:神秘的运行时故障,单例注册表不知何故不包含它应该包含的内容。

这可能是为什么模式/成语/whatchammacallit 很少使用的原因。它适用于目标代码文件,因为您明确地告诉链接器要包含什么。它对静态库的效果不太好。


最佳实践是通过代码(但可能通过文档)确保翻译单元中的某些内容被调用或引用,例如通过main.

这可确保存在可见的依赖关系,从而不会删除翻译单元。


我不知道任何常用的名称。在过去,在另一种语言中,有一种称为模块信封的东西,您可以将其视为负责初始化和清理模块的静态对象的构造函数和析构函数的执行。但是 C++ 不支持这一点,而且我记得,近年来在谷歌上搜索这个词并没有提供任何相关的点击。好像所有的信息都消失了……

于 2012-12-27T23:06:49.393 回答