2012-05-21 64 views
5

這可能嗎?可能通過調用函數初始化靜態變量

static bool initialize() 
{ 
    TRC_SCOPE_INIT(...); 
    ... 
} 

static bool initialized = initialize(); 

爲了使一個很長的故事,總之,我需要調用一系列的宏(初始化調試信息)儘早(線程X開始之前,我沒有這樣的功能。當線程X啓動時)。

+1

你可以在'main()'例程中向'pthread_once(3)'插入一個調用嗎? – sarnold

+0

@KingsIndian:'bool'在C99中使用'stdbool.h'頭部有效。 – icktoofay

+0

@icktoofay無論如何它沒有被指定爲c99,因此添加了C++標記。 –

回答

6

當我最初看到這個問題時,它被標記爲C和C++。代碼可能是C或C++,因爲bool是C99和C11中的一種類型,就像它在C++中一樣(幾乎在C中,您需要使用<stdbool.h>頭文件獲取名稱bool)。

兩個標籤的答案是:

  • 在C++中,是的。

  • 在C中,沒有。

他們是不一樣的語言。如果你需要演示,這是一個很好的例子。

+2

該問題最初發布時僅標記爲「c」。由於'bool',@ KingsIndian添加了'C++'標記,但是我恢復了該編輯,因爲'bool'在C99中是有效的,並且沒有從原始文章中指出它與C++相關。 – icktoofay

+0

@icktoofay:感謝您的澄清;我已經稍微調整了我的答案以認識到這些變化。 –

+0

對於那些好奇的人來說,(a)C++ 11允許你使用constexpr,(b)對它的編譯器支持令人驚訝的很少 –

1

這應該是正常的,只要您正在初始化的「東西」在與初始化它的函數的調用相同的翻譯單元中定義。另外,它必須在呼叫站點上方定義。否則,由於使用未初始化的值,可能會導致未定義的行爲。

解決此問題的一種方法是改用指針。靜態初始化的指針被編譯到可執行映像中,因此如果其他翻譯單元中定義的靜態函數使用它,則不存在未定義行爲的風險。在您的靜態初始化函數中,您動態分配「stuff」並將指針設置爲指向它,以便稍後可以訪問它。

4

如果你使用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; 
} 
1

(既然你提到的線程,我會假設你在您的處置有POSIX線程功能。)

功能pthread_once存在這個確切的目的。你需要的地方,以確保initialize已經被調用,寫:

pthread_once(&init_once, initialize); 

其中init_once與靜態存儲時間,如果需要定義,並可能具有外部鏈接,如pthread_once_t init_once