2011-04-19 64 views
0

我剛遇到一個奇怪的問題。在WinMain.cpp,以後我有一個用戶創建的頭文件,但在此之前的WinMain,我宣佈一個全局實例我的類腦的,就像這樣:在const聲明之後構造全局對象之前是如何構造的?

(windows includes) 
#include "BrainLib.h" 
#include "Brain.h" 

Brain brain; 

(wndproc declaration) 

WinMain() { 
    (some code using Brain) 
} 

BrainLib.h,我宣佈爲普通程序中使用的一些常量,如const unsigned short SERVER_PORT = 12345;const std::string SERVER_IP_STRING = "192.168.1.104";請注意,Brain.h還包括BrainLib.h

現在,它變得有趣。 Brain包含一個只能連接到一臺服務器的Winsock客戶端包裝類。因此,Winsock客戶端具有一個構造函數,它需要一個端口/ IP並且沒有默認的構造函數。因此,它必須在大腦構造函數初始化列表初始化像這樣:

Brain::Brain() : winsockClient(SERVER_PORT, SERVER_IP_STRING) 
{ 
} 

然而,SERVER_IP_STRING仍然未初始化的時候,大腦的構造函數被調用!我在WinMain中添加了一個支票,並且在那個時候構建了它,但似乎首先調用了Brain構造函數,儘管它出現在第二位。這怎麼/爲什麼會這樣?

另外,只是爲了讓這個陌生人:我複製了源代碼並在不同的機器上編譯,並且它按預期工作。每個版本都運行同一版本的MSVS 2008,不過我想可能是用某種不同的版本設置。

+0

您是否在非工作編譯器版本中將'SERVER_IP_STRING'聲明爲'const string'? – iammilind 2011-04-19 01:58:20

+0

對不起,對,兩個服務器變量都聲明爲const!不能相信我把它留下了。編輯。 – rotanimod 2011-04-19 02:02:01

+0

而工作版本具有完全相同的源代碼。 – rotanimod 2011-04-19 02:03:13

回答

3

全局對象初始化的順序是未定義的。

+0

真的嗎?這是最讓我感到羞恥的事情。任何想法如何使我的代碼始終工作呢? – rotanimod 2011-04-19 02:05:39

+4

最好的辦法是避免使用全局變量,但要將它們封裝在函數中 – Oswald 2011-04-19 02:11:37

+0

我儘量避免使用全局變量,但通常每次程序都有一次欺騙和使用一次,以便在WinMain/WndProc之間輕鬆傳遞。猜猜我最終會學到另一種選擇。謝謝。 – rotanimod 2011-04-19 02:34:57