.cpp文件头部的静态语句未被调用
static statement at the head of .cpp file not called
我在公司的公共基础代码中有一个名为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_;
}
}
相关文章:
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- 在 COUT 语句中使用 COUT 调用函数
- 调用多个类而不带 if 语句
- 错误:调用 .. at return 语句时没有匹配函数
- 在可变函数调用中执行一次语句
- 在 if 语句中调用重载构造函数失败
- C++实用程序,用于将长开关语句转换为封装开关案例阶梯的简洁函数调用
- 如果语句表达式调用函数,则需要测试是否为 true
- return 语句,该语句调用在返回 void 的函数中返回 void 的函数
- C++ While(1) 循环内部没有调用 if 语句
- 一个关于在函数中运行未调用语句的非常奇怪的错误
- 为什么我要尝试在一个if语句中调用两个fucntions,但是在第一个完成后它忽略了另一个功能?(C )
- 在返回语句中调用默认构造函数
- 有没有办法查看此语句"Student s3=func(s1, s4)"将调用哪个构造函数?
- 是否可以在一个语句中创建对象并调用方法?
- 在 c++ 中,如何修改运算符以便在同一语句中连续调用它两次
- 递归可变参数函数调用对简单 if.else 语句的性能
- c++中克隆系统调用语句出错
- C++将向量传递给重载类——有些调用语句有效,有些则无效
- "Objective C" vs "C++":方法调用语句的差异