如何找到无意中的对象指针比较?

rma*_*ddy 5 objective-c llvm compiler-warnings ios

快速问题 - 是否有一种很好的方法来找到==对象的用途而不是isEqual:

全文:

我有一堆像这样的代码:

typedef long DataKey;

DataKey x;
DataKey y;

if (x == y) {
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

我现在需要使用longfor 替换DataKey对象.在创建类并进行一堆全局搜索和替换之后,我的代码现在有点像这样:

@interface DataKey : NSObject

DataKey *x;
DataKey *y;

if (x == y) { // uh-oh - this is now bad
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

我是否可以在编译器中启用警告,警告在指针中使用标量运算符?我正在使用Xcode 4.5.2和LLVM 4.1编译器.我找不到一个.

还有其他任何建议来帮助修复所有这些代码吗?这不是一个简单的代码库.有数百个源文件要处理.这是一项重大的重构工作.

编辑:

如果有一个警告就像你在一个if条件而不是比较中使用赋值那样会很棒.您可以获得此警告并使用括号来停止警告.

更新:

根据评论中的建议,我将-Weverything编译器选项添加到测试项目中.当比较两个对象指针时,这没有产生任何期望的结果==.

也许可以实现C++的组合,重载operator==方法,以及在尝试使用该运算符时获得一些编译器警告/错误.我可以发布另一个关注此选项的问题.

Chu*_*uck 2

我很确定没有这样的警告,因为比较指针是否相等是很常见的,而且并非所有通常都会出错。不幸的是,您最好的选择是通过任何可能以这种方式使用 DataKeys 的地方并搜索 ==。我知道,不太有趣。

  • 根据 SO 上尝试使用“==”比较两个“NSString”对象的新手问题的数量,我不得不同意错误地使用“==”并不常见。我敢打赌,这种情况很常见,就像在条件中意外使用赋值而不是比较一样,并且编译器支持该问题。 (3认同)
  • @rmaddy:我们只是解释为什么没有编译器选项。 (3认同)
  • @rmaddy:我想 Chuck 的意思是比较指针是否相等也很常见;而条件语句中的赋值*通常*是一个错误。 (2认同)