是否可以获得此代码的警告,其中指针用于if
语句?
NSObject *someObject = ...;
if (someObject) { // warning here
...
}
为了清晰和安全,我想要这样做:
NSObject *someObject = ...;
if (someObject != nil) { // warning here
...
}
答案 0 :(得分:0)
更新 - 感谢@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正确地指出== YES
检查在if (str.length)
之类的str
表达式失败时长度恰好为1个字符,单独== NO
是不够的,因为编译器默默地忽略了对NO
(或0
,NULL
)指针的比较。
而且最后,如果在if
内使用函数调用,则此hack可能会导致函数调用两次,因此如果函数不纯,这可能会导致意外结果。所以,要注意:)