簡體   English   中英

如何在main之前強制初始化靜態局部變量?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM