不调用.cpp文件头部的静态语句

时间:2014-08-05 12:41:43

标签: c++ static

我在公司的公共基础代码中有一个名为Receiver的类文件。

这个类的cpp文件的第一行(在#include行之后)说:

static const bool res = ReceiverFactory::registerCreator(Receiver::getProjectReceiverName(), Receiver::create );

在使用此代码的应用程序之一上,我可以看到此行在应用程序启动时运行。

在类似的应用程序中,情况并非如此。这条线根本不运行。我需要显式构造该类的对象以使该行执行。

这是VS解决方案/项目配置问题吗?还有其他想法吗?

1 个答案:

答案 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_;

}
}