我正在使用Ogre和NxOgre,它們都有一個Real
typedef,它是float
或double
,具體取決於編譯器標誌。這導致我們大多數編譯器警告現在是:當類型可能改變時,如何最好地處理警告c4305?
warning C4305: 'argument' : truncation from 'double' to 'Ogre::Real'
當以0.1爲例初始化變量時。通常我會使用0.1f,但如果您將編譯器標誌更改爲雙精度,那麼您會得到反向警告。我想這可能是最好的選擇一個並堅持下去,但我想寫一個適用於任何配置的方式,如果可能的話。
一種修復方法是在出現的文件中使用#pragma warning (disable : 4305)
,我不知道是否還有其他更復雜的問題可以通過不發出此警告來隱藏。我知道我會推送並在頭文件中彈出它們,以便它們不會最終在代碼中傳播。
另一種方法是創建一個基於類似的準確性編譯選項的一些宏:
#if OGRE_DOUBLE_PRECISION
#define INIT_REAL(x) (x)
#else
#define INIT_REAL(x) static_cast<float>(x)
#endif
這將需要改變所有的變量初始化迄今所做的,但至少這將是未來的證明。
任何偏好或我沒有想到的東西?
'的static_cast(0.1)'? –
jalf
2010-05-25 12:34:43
@jalf - 當你初始化默認值的時候,如果你把它們全部放在這個地方,那麼它就有點兒含義 - 這就是爲什麼我想用一個短的宏。我可以鍵入這個或什麼來使它更易讀/少打字? – identitycrisisuk 2010-05-25 12:43:38
你可以定義一個函數而不是宏。 'template inline Ogre :: Real real(T val){return static_cast (val); }' –
jalf
2010-05-25 12:59:50