我有代码:
#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。
答案 0 :(得分:2)
嗯,关于g ++ _MSC_VER
没有定义,因为你注意到它是Visual C ++特有的。
您可以尝试添加以下内容:
#ifdef _MSC_VER
#if _MSC_VER <= 1300
// Your code
#endif
#endif
另外,如果我正确地阅读C ++标准,则未定义的标识符将替换为0,因此它会传递您的条件并编译,就好像您使用的那样#34;古老的Visual C ++&#34 ;
摘自 16.1条件包含:
由于宏扩展和定义的一元运算符而导致的所有替换后 已执行,所有剩余的标识符和关键字(true和false除外)将被替换 使用pp-number 0,然后将每个预处理标记转换为标记。
答案 1 :(得分: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)?