2012-04-18 98 views
1

我試圖確保一個函數將被程序首先調用,以確保關鍵對象的初始化。然而,我很困惑如何init_seg被假定爲被使用/被調用。使用init_seg調用初​​始化函數

例如,從msdn的文檔看起來好像下面是第一個被調用的。

#pragma init_seg(".CRT$XCC") 

static void InitializeStuff() 
{ 
    printf("InitializeStuff\n"); 
} 

但是,似乎並不是這種情況,因爲該函數顯然不會自動調用(除非我明確地稱它爲當然)。

如何使用init_set確保函數在其他執行代碼之前被調用?

+0

你想在'main()'之前調用它嗎?這就是你想要的嗎? – Nawaz 2012-04-18 08:51:26

+0

我想確保它是我的應用程序的第一件事。我在今天早些時候從Bo Persson的答案提出了這個問題http://stackoverflow.com/questions/10198675/compiler-specific-memory-initialization。 – chadb 2012-04-18 08:55:18

+0

我認爲你需要使用['init_seg'](https://msdn.microsoft.com/en-us/library/7977wcck.aspx)的第四個(?)版本,它使用函數名稱:'#pragma init_seg (「.CRT $ XCU」,「InitializeStuff」)。 – jww 2017-03-20 05:05:43

回答

1

如果我的理解是正確的,你將要在同一文件中的第一初始化爲#pragma init_seg

例如,所有的全局變量:

#pragma init_seg(".CRT$XCB") 

class A 
{ 
    A() 
    { 
     printf("first!\n"); 
    } 
}; 

static A first; 

並確保你不將任何其他該文件中的全局變量不是您想要首先初始化的全局變量。

+0

你的例子顯示了一個類的使用,但是,我希望用我在文章中提到的一個函數來做到這一點。你有什麼特別的理由來證明你的課堂?它是否必須是一個班級?用函數做不可能嗎?如果不是,爲什麼不呢? – chadb 2012-04-18 09:15:14

+0

不是,編譯指示只對靜態/全局對象的創建順序排序,因爲它們的順序是未排序的/未知的。如果你想在你的程序中首先調用一個函數,爲什麼不先調用它呢? – David 2012-04-18 09:18:43

+0

如果你真的想使用init_seg指令,我建議你不要,你可以創建一個類並在其構造函數中運行所有的initalisation代碼(用你的代碼替換「printf(」first!\ n「);」) ... – David 2012-04-18 09:20:20