最近,在将一个c ++项目从Windows移植到Linux时,我偶然发现了一些语法奇怪的代码。
if ( isObjectNear( objectPos, objectLength ) + .025, 0.125 ) { ... }"
在这个if语句中,括号错位,导致语句由两个用逗号分隔的表达式组成。布尔“isObjectNear(..)”方法有默认参数,允许使用Microsoft的编译器进行调用,尽管有明显的错误。
在使用GCC在Linux上构建时,发现了一个问题:
错误:未使用计算的值[-Werror = unused-value]
我的案例中的代码比问题的相关性更有趣,以下代码更清楚地用于评论中的返回值来表达问题的目的:
if ( true, 0.5 ) ... // returns true since 0.5 > 0 ( 0 == false)
if ( true, 0.0 ) ... // returns false
if ( 1.0, false ) ... // returns false
if ( true, false, false, ..., true ) ... // returns true
回到问题“为什么Microsoft的C / C ++编译器允许使用逗号分隔表达式的if语句?”
答案 0 :(得分:3)
允许,因为它在语法上是正确的,并且符合标准的编译器必须接受它。
GNU编译器猜测丢弃左手表达式的结果不是故意的,并且有助于给出警告。您已告诉编译器将警告视为错误。如果您还没有这样做,那么gcc也会允许。
当不使用表达式的结果时,标准不要求编译器提供诊断,并且Microsoft可能选择不这样做。即使在gcc中,即使Wunused-value
也未启用Wall
,这表明它被视为可能存在许多误报的选项。不过,我不认为这个案例是误报。在我看来,一个明显的程序员错误。
编辑。显然,msvc也发出警告,正如Richard Crittenden所评论的那样。