[英]Strange behavior of the preprocessor g++ in MinGW
我有代碼:
#if _MSC_VER <= 1300
float round(float f)
{
if (f < 0)
return ceilf (f - 0.5);
else
return floorf (f + 0.5);
}
#endif
上面的幾行應僅在舊版本的Visual C ++編譯器中進行編譯。 我用MinGW編譯器編譯此代碼。 那里沒有像_MSC_VER這樣的符號,並且不必編譯,因為表達式#if _MSC_VER <= 1300
必須等於false。 但是,它可以編譯。 有人可以解釋一下為什么會發生嗎?
MinGW中的編譯是GNU 6.3.0。
好吧,在g ++上, _MSC_VER
,正如您所指出的,它是Visual C ++特有的。
您可以嘗試添加以下內容:
#ifdef _MSC_VER
#if _MSC_VER <= 1300
// Your code
#endif
#endif
另外,如果我正在閱讀C ++標准權利,則未定義的標識符將替換為0,因此它將傳遞條件並進行編譯,就好像您使用的是“古老的Visual C ++”一樣。
節錄自16.1 :
在執行了由於宏擴展和定義的一元運算符引起的所有替換之后,將所有其余的標識符和關鍵字(除true和false之外)替換為pp-number 0,然后將每個預處理令牌轉換為令牌。
如果_MSC_VER
則編譯器將看不到#if
至#endif
包括)的任何代碼。
根據上下文,編譯器將看到有效的源代碼,並成功對其進行編譯。 請放心,盡管std::round
可能已隱式包含在某處,但您的round
版本不會構成編譯程序的一部分。
最后,存在使用0.5
的加性常數設計round
函數的故障。 請參閱為什么很多(舊)程序都使用floor(0.5 +輸入)而不是round(輸入)?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.