我在公司的公共基础代码中有一个名为Receiver的类文件。
这个类的cpp文件的第一行(在#include行之后)说:
static const bool res = ReceiverFactory::registerCreator(Receiver::getProjectReceiverName(), Receiver::create );
在使用此代码的应用程序之一上,我可以看到此行在应用程序启动时运行。
在类似的应用程序中,情况并非如此。这条线根本不运行。我需要显式构造该类的对象以使该行执行。
这是VS解决方案/项目配置问题吗?还有其他想法吗?
答案 0 :(得分:1)
听起来链接器因为缺少对它的引用而忽略或推迟对该语句的评估。但是,此问题之前已经解决,因此您可能希望利用现有解决方案。一种解决方案是拥有一个初始化例程列表,这些例程在初始化时在main()方法中显式迭代。这或多或少是Google的Chromium源代码中的REGISTER_MODULE_INITIALIZER函数采用的方法:
http://src.chromium.org/svn/releases/3.0.190.2/src/third_party/cld/base/googleinit.h
特别是使用该代码,可以这样做:
REGISTER_MODULE_INITIALIZER(register_creator, {
ReceiverFactory::registerCreator(
Receiver::getProjectReceiverName(), &Receiver::create);
});
然后使用:
在main中显式初始化此(和其他模块)int main(int argc, char* argv[]) {
RUN_MODULE_INITIALIZERS();
// ...
}
还有其他方法可以执行此类静态初始化,例如__attribute__((constructor))
(虽然这是非标准的)或静态创建非POD对象,其构造函数执行您想要的初始化,例如:
namespace initialization {
namespace {
class DoStaticInitialization {
public:
DoStaticInitialization() {
ReceiverFactory::registerCreator(
Receiver::getProjectReceiverName(), &Receiver::create);
}
};
DoStaticInitialization initializer_instance_;
}
}