2011-12-05 143 views
1

我有下面的代碼的HPP文件:恆值計算

const float PixelsPerMeter = ConfigManager->Get<float>("koef", 100.0f); 

inline const float Meters2Pixels(float meters) { return meters * PixelsPerMeter; } 
inline const float Pixels2Meters(float pixels) { return pixels/PixelsPerMeter; } 

const float ScreenArea = Pixels2Meters(ScreenSizeX) * Pixels2Meters(ScreenSizeY); 

它的工作,但現在ScreenArea = inf莫名其妙。我從靜態函數中使用它。我在該函數中放置了一個斷點,並打印出PixelsPerMeter(100.0),ScreenSizeXScreenSizeY的值。一切都很好,但ScreenArea計算錯誤。

當我直接寫Pixels2Meters(ScreenSizeX) * Pixels2Meters(ScreenSizeY)而不是使用ScreenArea常量一切正常。

這是怎麼回事?

回答

2

我認爲,問題是你的全局變量,要精確其初始化沒有初始化的問題。

如果時間變量尚未動態當你調用初始化Pixels2Meters(),變量PixelsPerMeter靜態初始化爲零,因此函數返回Pixels2Meters()inf非常意味着PixelsPerMeter爲零。

但是,你把斷點,故事可能會略有不同;它類似於Heisenberg uncertainty principle,意思是當你想通過放置斷點看到PixelsPerMeter的值時,它顯示出與沒有斷點時的值不同的值。

還要注意,由於該變量聲明const,沒有extern關鍵字,變量具有內在聯繫,這意味着你將在每個翻譯單元這個變量的不同副本,在情況下,如果在頭文件中聲明你包含在幾個源文件中。該變量的行爲就好像它被宣佈爲static

另一個重要點要注意的是,這個變量被初始化兩次:第一初始化稱爲靜態初始化這發生在編譯時,和第二初始化被稱爲動態初始化這發生在運行時。在靜態初始化的情況下,變量被初始化爲零,並且這是導致問題的正在使用的值。爲了更多地瞭解它,閱讀:

你也應該瞭解這一點:

+1

很好的答案,謝謝。 – Ockonal

0

靜態函數初始化時有點複雜,可能取決於系統/編譯器。

,你可能會有的CONFIGMANAGER()是靜態函數之前,您使用它。

+0

當你理解的'第二個參數在某些額外情況下,從配置中獲取'是默認值。我測試了它(設置不是100,但是是另一個值),它等於100,所以,config manager在那裏工作得很好。 – Ockonal