[英]How to force the initialization of a static local variable before main?
考虑下面的一对函数:
double MYAPI foo(double x) {
return x;
}
Register register_foo_([] {
return reg(&foo, "foo", ...); // function name repeated used
});
register_foo_
是一个全局变量,在dllmain
之前初始化,其构造函数采用一个lambda,它重复地引用字面上方的函数名。 如果注册代码可以在上面的函数内移动以减少出错的可能性,那将是很好的。 我试过了:
double MYAPI foo(double x) {
static Register register_foo_([] {
return reg(&foo, "foo", ...); // static local does not initialize before dllmain
});
return x;
}
如果以上代码有效,那么我可以轻松将其转换为使用__FUNCNAME__
的宏。 有没有办法强制在dllmain之前初始化静态局部变量register_foo_
?
函数(方法)本地的静态变量在首次使用它们所在的函数时初始化。(它们在程序加载时初始化为零,然后在首次输入函数时通过代码“正确”初始化。)参见回答这个问题 。 因此,您建议将该代码移动到函数中会改变初始化的语义,并且它将无法工作。
您的原始代码有效,所以您显然想要的是将代码移动到函数内部,以便它在某种程度上紧密地联系在一起 - 或者代码的读者的头脑 - 以便您可以看到您的字符串常量名称和功能名称是对的。 也许这样你就可以确保注册完成了。 因此你想要的是干涸。
传统(也是唯一)实现这一目标的方法是使用扩展到注册调用和函数头的预处理器宏。
您建议自己使用宏 - 现在扩展宏,这样它不仅生成注册函数, 还生成函数头。
这在main()
之前运行一个函数,不确定它是否适用于dllmain()
:
#include <iostream>
int func_before_main()
{
std::cout << "func_before_main()" << '\n';
// do before main stuff
return 0;
}
const int dummy = func_before_main();
int main()
{
std::cout << "main()" << '\n';
}
输出:
func_before_main()
main()
我想你想要实现类似于的语法:
DEFINE_FUNC(void, foo, (double x)) {
return x;
}
...并自动生成样板。 如果你在一个声明的帮助下将Register
放在函数之上,这实际上非常简单:
#define DEFINE_FUNC(Ret, name, args) \
Ret name args; \
Register register_##name##_([] { \
return reg(&name, #name, ...); \
}); \
Ret name args
不,没有。 那是你的答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.