2012-12-05 24 views
5

快速的问题 - 有没有一种很好的方法来找到==用于物体而不是isEqual:的用法?如何找到意外的对象指针比较?

全文:

我有一堆的代码有点像这样:

typedef long DataKey; 

DataKey x; 
DataKey y; 

if (x == y) { 
    // do stuff 
} 

我现在有必要使用longDataKey与对象进行替换。创建类,做了一堆全局搜索和替换之后,我的代码现在是一种像这样:

@interface DataKey : NSObject 

DataKey *x; 
DataKey *y; 

if (x == y) { // uh-oh - this is now bad 
    // do stuff 
} 

有一个警告,我可以在发出警告的指针采用标量运算符的编译器能?我正在使用Xcode 4.5.2和LLVM 4.1编译器。我一直无法找到一个。

还有其他一些可帮助修复所有这些代码的建议吗?这不是一个简单的代码库。有数百个源文件需要处理。这是一个重大的重大努力。

编辑:

这将是巨大的,如果有一个警告,当您在if条件,而不是比较使用赋值很像。您可以为此发出警告并使用括号来停止警告。

更新:根据在意见建议

,我添加了-Weverything编译器选项的测试项目。当将两个对象指针与==进行比较时,这不会产生任何期望的结果。

也许C++的组合,重载operator==方法,并尝试使用该操作符时得到一些编译器警告/错误可以实现。我可能会发布另一个关于这个选项的问题。

+0

好问题。 [检查它是否是一个有效的指针](http://www.cocoawithlove.com/2010/10/testing-if-arbitrary-pointer-is-valid.html),然后将自定义编译器警告添加为'#警告一些文本'。不确定那是你在找什么。 – iDev

+0

@ACB我不知道如何在这里应用该链接的信息。我正在寻找(理想情况下)编译时检查。该链接用于运行时检查。 – rmaddy

+0

这将是一个合理的编译器选项,但我从来没有见过这样的,我不能不顾手中的任何宏观技巧或任何强制错误。 –

回答

2

我敢肯定,没有这样的警告,因为比较指针的平等是相当普遍的,而不是所有的错误。不幸的是,您最好的选择是通过任何地方DataKeys可能会以这种方式使用并搜索==。我知道不是很有趣。

+3

基于SO上的新手问题数量,他们试图用'=='来比较两个'NSString'对象,我不得不不同意用错误==不常见。我敢打赌,这是常见的,因为意外地在条件中使用赋值而不是比较,并且有编译器支持这个问题。 – rmaddy

+2

@rmaddy:我想Chuck意思是比较指针是否平等也很常见;而条件陈述中的分配通常是错误的。 – mipadi

+0

@mipadi我在说我不同意比较平等的指针是常见的。至少在我自己的代码中,这是非常罕见的。我总是添加一条评论来清楚说明我真的打算用'=='进行比较。事实上,在近20万行代码中,我只做了一次。我毫不怀疑,其他人更经常这样做。 – rmaddy