這可能嗎?可能通過調用函數初始化靜態變量
static bool initialize()
{
TRC_SCOPE_INIT(...);
...
}
static bool initialized = initialize();
爲了使一個很長的故事,總之,我需要調用一系列的宏(初始化調試信息)儘早(線程X開始之前,我沒有這樣的功能。當線程X啓動時)。
這可能嗎?可能通過調用函數初始化靜態變量
static bool initialize()
{
TRC_SCOPE_INIT(...);
...
}
static bool initialized = initialize();
爲了使一個很長的故事,總之,我需要調用一系列的宏(初始化調試信息)儘早(線程X開始之前,我沒有這樣的功能。當線程X啓動時)。
當我最初看到這個問題時,它被標記爲C和C++。代碼可能是C或C++,因爲bool
是C99和C11中的一種類型,就像它在C++中一樣(幾乎在C中,您需要使用<stdbool.h>
頭文件獲取名稱bool
)。
兩個標籤的答案是:
在C++中,是的。
在C中,沒有。
他們是不一樣的語言。如果你需要演示,這是一個很好的例子。
該問題最初發布時僅標記爲「c」。由於'bool',@ KingsIndian添加了'C++'標記,但是我恢復了該編輯,因爲'bool'在C99中是有效的,並且沒有從原始文章中指出它與C++相關。 – icktoofay
@icktoofay:感謝您的澄清;我已經稍微調整了我的答案以認識到這些變化。 –
對於那些好奇的人來說,(a)C++ 11允許你使用constexpr,(b)對它的編譯器支持令人驚訝的很少 –
這應該是正常的,只要您正在初始化的「東西」在與初始化它的函數的調用相同的翻譯單元中定義。另外,它必須在呼叫站點上方定義。否則,由於使用未初始化的值,可能會導致未定義的行爲。
解決此問題的一種方法是改用指針。靜態初始化的指針被編譯到可執行映像中,因此如果其他翻譯單元中定義的靜態函數使用它,則不存在未定義行爲的風險。在您的靜態初始化函數中,您動態分配「stuff」並將指針設置爲指向它,以便稍後可以訪問它。
如果你使用GCC(或鐺),你可以使用__attribute__((constructor))
:
static bool initialized = false;
__attribute__((constructor))
static void initialize(void) {
initialized = true;
// do some other initialization
}
int main(int argc, char **argv) {
// initialize will have been run before main started
return 0;
}
(既然你提到的線程,我會假設你在您的處置有POSIX線程功能。)
功能pthread_once
存在這個確切的目的。你需要的地方,以確保initialize
已經被調用,寫:
pthread_once(&init_once, initialize);
其中init_once
與靜態存儲時間,如果需要定義,並可能具有外部鏈接,如pthread_once_t init_once
。
你可以在'main()'例程中向'pthread_once(3)'插入一個調用嗎? – sarnold
@KingsIndian:'bool'在C99中使用'stdbool.h'頭部有效。 – icktoofay
@icktoofay無論如何它沒有被指定爲c99,因此添加了C++標記。 –