叮当警告,用于 if、for、while 等中的指针



是否可以收到此代码的警告,其中指针在if语句中使用

NSObject *someObject = ...;
if (someObject) { // warning here
...
}

为了清楚和安全起见,我想要求这样做:

NSObject *someObject = ...;
if (someObject != nil) { // warning here
...
}

更新- 感谢@rmaddy指出原始版本中的缺陷。

一种非常非常笨拙的方法是将if重新定义为这样的东西:

#define if(...) if ((__VA_ARGS__) == YES || (__VA_ARGS__) != NO)

因此,if (someObject)表达式将由预处理器转换为

if (someObject == YES || someObject != NO)

这将给出编译警告/错误

指针和整数之间的比较("NSObject *"和"int")

请注意,错误消息不是很有暗示性,可能会导致混淆,仅当您确实希望不允许编译if (x)等表达式时,才应使用该解决方案。

== YES!= NO检查都是需要的,因为@rmaddy正确地指出,当str长度不正好为 1 个字符时,== YES检查对于像if (str.length)这样的表达式将失败,仅靠== NO是不够的,因为编译器默默地忽略了指向NO(或0)的指针的比较,NULL)。

最后,如果在if中使用函数调用,则此黑客可能会导致函数调用两次,因此如果函数不是纯函数,这可能会导致意外结果。所以,要小心:)