Mingw中预处理器G 的奇怪行为

Strange behavior of the preprocessor g++ in MinGW

本文关键字:预处理 处理器 Mingw      更新时间:2023-10-16

我有代码:

   #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上未定义,如您所指出的,它是视觉C 特定的。

您可以尝试添加以下内容:

#ifdef _MSC_VER
#if _MSC_VER <= 1300
// Your code
#endif
#endif

另外,如果我正在阅读C 标准,则未定义的标识符被0替换,因此它会通过您的条件和编译,就好像您使用了"古老的Visual C "。

摘录摘自 16.1条件包含

由于宏扩展和定义的一元操作员,所有替换均已替换 已经执行了所有剩余的标识符和关键字,除了真和错误,都将替换 使用pp-number 0,然后将每个预处理令牌转换为令牌。

如果未定义 _MSC_VER,则编译器将不会从 #if到包括 #endif中看到任何代码。

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

最后,使用0.5的添加剂常数来设计round功能存在故障。请参阅为什么很多(旧程序)使用地板(0.5 输入)而不是回合(输入)?