代码之家  ›  专栏  ›  技术社区  ›  Сергей

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

  •  0
  • Сергей  · 技术社区  · 8 年前

    我有代码:

       #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编译器编译了这段代码。没有像\u MSC\u VER那样的符号,它的代码也不需要编译,因为表达式 #if _MSC_VER <= 1300 必须等于false。但是,它是可以编译的。 谁能解释一下为什么会这样?

    在MinGW中编译是GNU 6.3.0。

    2 回复  |  直到 8 年前
        1
  •  2
  •   Kamiccolo    8 年前

    嗯,在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编号为0,然后将每个预处理标记转换为一个标记。

        2
  •  0
  •   Bathsheba    8 年前

    如果 _MSC_VER 未定义,则 编译器 将看不到来自和包括的任何代码 #if 至并包括 #endif .

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

    最后,使用相加常数存在错误 0.5 设计a 圆形的 作用看见 Why do lots of (old) programs use floor(0.5 + input) instead of round(input)?