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

static statement at the head of .cpp file not called

本文关键字:调用 语句 静态 文件 头部 cpp      更新时间:2023-10-16

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

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

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

在其中一个使用这段代码的应用程序中,我可以看到这一行在应用程序启动时运行。

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

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

听起来链接器由于缺少对该语句的引用而省略或延迟了对该语句的求值。不过,这个问题以前已经解决了,因此您可能希望利用现有的解决方案。一种解决方案是在初始化时在main()方法中显式迭代初始化例程的列表。这或多或少是Google的REGISTER_MODULE_INITIALIZER函数所采用的方法,该函数在Chromium源代码中:

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中显式初始化this(和其他模块),使用:

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_;
}
}