我有代码:

   #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值为0,然后将每个预处理令牌转换为令牌。

10-08 08:22