是否可以收到此代码的警告,其中指针在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
中使用函数调用,则此黑客可能会导致函数调用两次,因此如果函数不是纯函数,这可能会导致意外结果。所以,要小心:)