2009-11-19 103 views
0

我真正想要的是,我怎麼知道每個C++初始化階段何時真正完成?檢測靜態初始化階段?

有簡單的東西被分配的靜態初始化。然後是動態靜態初始化,其中更復雜的靜態分配被賦予,這不是跨'翻譯單位'定義的。這太可怕了,並且沒有很多簡單的方法可以應付。我在地方使用名稱空間來做加載頭文件時發生的立即分配,但是這裏的缺陷是,這可能會在其中一個初始化階段被覆蓋。

我可以設置初始化爲它做「正確的事」的功能,但它會容易得多,如果我能知道我在某種程度上是什麼「的階段」。據我所知,這是不可能的,但我希望在那裏有人會有一些好消息。

我已經解決了導致這個問題的問題,這是代碼沒有被意外地鏈接,因爲它在項目中。知道這個答案仍然很好,但我猜測答案是'沒有辦法知道肯定'。

我編輯的問題,我真的不想知道主要是本身開始。

+5

我認爲如果你正在根據你的設計是否已經開始你正在吠叫錯誤的樹。聽起來好像你正在創建一個脆弱的框架,如果你說在多線程環境中使用它,以後可能會有技術上的困難。 – 2009-11-19 08:54:46

+1

你需要什麼?我從來沒有見過這種情況會有用。你可以重新設計,讓問題消失嗎? – Thomas 2009-11-19 08:56:20

+0

它不只是看到main是否啓動,當然如果我在main調用某個東西,main就開始了。我想知道的原因是,在初始化運行時知道我處於什麼階段會很高興。 – 2009-12-03 04:24:08

回答

1

怎麼是這樣的:

bool is_started(bool set_started=false){ 
    static bool flag = false; 
    if(set_started) 
    flag=true; 
    return flag; 
} 

main(){ 
    is_started(true); 
} 
0

如果你的問題是有關Windows,我知道你可以檢測來自一個過程messagepump已經開始。這樣你肯定知道一切都已經初始化了。

當然這不適用於* nix

+0

或用於控制檯應用程序。 – 2009-11-19 10:43:20

3

我不明白你想解決什麼問題。

當你建立你的應用程序,鏈接器添加了啓動代碼,當操作系統在內存中加載程序來執行的第一個代碼。這段代碼將完成所有初始化工作,完成後將調用main()函數。

如果你談論的是用自己的替換這個代碼,你應該檢查你的編譯器/連接器的內部細節(和非常肯定你知道你在做什麼!)。

如果你的問題是關於有多個進程,並且你需要知道一個進程是否已經啓動,你應該使用正確的同步機制(可以是底層操作系統提供的機制或你自己創建的機制之一) )。

+1

「初始化東西」包括調用構造函數和初始化全局對象所需的其他函數,所以在main()之前運行一些自己的代碼是正常的。 – 2009-11-19 13:18:02

0

如果您在Windows上運行,創建初始化完成後,mutex。然後,您可以在該互斥量上使用WaitForSingleOject來檢測程序是否真正初始化。

許多應用程序會這樣做來檢測啓動是否完成以及應用程序的其他實例是什麼。如果您只想運行一個程序的實例,則尤其如此。