[英]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.