MinGW中预处理器g ++的奇怪行为

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MinGW中预处理器g ++的奇怪行为相关的知识,希望对你有一定的参考价值。

我有代码:

   #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 compiller编译这段代码。那里没有像_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在内的任何代码。

根据上下文,编译器将看到有效的源代码,并成功编译它。请放心,您的round版本不会成为已编译程序的一部分,尽管std::round可能已被隐含地包含在某处。

最后,使用0.5的加性常数来设计round函数存在缺陷。见Why do lots of (old) programs use floor(0.5 + input) instead of round(input)?

以上是关于MinGW中预处理器g ++的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

使用制服时 Xamarin OpenGL 片段着色器的奇怪行为

在 Python 多处理进程中运行较慢的 OpenCV 代码片段

在 Qt 中移动头文件时出现奇怪的预处理器行为

如何在 C++ 预处理器中检测 g++ 和 MinGW?

字典操作中的奇怪行为以及 Python 中的多处理

奇怪的行为:列表理解中的 Lambda