簡體   English   中英

MinGW中預處理器g ++的奇怪行為

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM