检测" ="而不是" =="如果条件错误

时间:2014-11-21 23:43:12

标签: c++ if-statement g++

如果我在c ++中的if条件中使用=而不是==,是否有办法让g ++产生编译错误?我已经做过几次这个错字了,跟踪它很烦人。那就是:

if (x=5){ //bad - sets x equal to 5
   //do something
}    

3 个答案:

答案 0 :(得分:6)

-Wparentheses选项专门警告此类案例,这也是-Wall选项的一部分。

来自gcc documentation

  

-Wparentheses

     
    

如果在某些上下文中省略了括号,则发出警告,例如在预期真值的上下文中存在赋值时,     或者当运算符嵌套时,人们经常会得到优先级     困惑。

         

...

         

如果存在这种混淆的可能性,GCC将在指定此标志时发出警告。 要消除警告,请在最里面的if语句周围添加显式大括号,这样其他方法就无法属于封闭if。

  

可以通过指定-Werror=parentheses来转换为错误。

请注意

if(x=5) {...}

是合法的,标准不需要此类诊断。但是允许实现提供任何数量的此类有用警告。

答案 1 :(得分:1)

你可以用不同的编码风格来解决这个问题:我知道很多程序员都喜欢使用样式if (5 == x),因为如果你忘记了一个等号,你会得到if (5 = x)不编译(5不是左值)。

除了比修改编译器选项更简单之外,它还可以移植到任何标准C ++编译器。

国际海事组织,唯一的缺点是,如果你不习惯它,它就不会自然而然地读出来;在英语中,更常见的是“如果x等于5”而不是“如果5等于x”。当然,由于平等是可交换的,两者都是正确的,但大多数人更喜欢前者。这是从风格角度看似错误的事情确实有助于编写更易维护的代码的案例之一。

答案 2 :(得分:0)

Yoda condition是一个简单的,独立于编译器的解决方案:if (5=x){statement}将无法编译。