对if,for,while等指针的clang警告

时间:2018-01-29 13:26:26

标签: objective-c clang

是否可以获得此代码的警告,其中指针用于if语句?

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

为了清晰和安全,我想要这样做:

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

1 个答案:

答案 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(或0NULL)指针的比较。

而且最后,如果在if内使用函数调用,则此hack可能会导致函数调用两次,因此如果函数不纯,这可能会导致意外结果。所以,要注意:)