我只花了一些时间找出为什么一个可变集合没有正确地交叉自己 与另一组,使用
[someMutableSet intersectsSet:anotherSet]; // not the best idea
当然,正确的语法是[someMutableSet intersectSet:anotherSet]
,上面的行意味着不同的东西 - 它是一个返回值为BOOL
类型的方法调用。
由于我启用了-Wall -Wextra
选项,因此应该将其作为警告捕获。 但未被抓住 。我通过尝试进一步调查,其中types
是NSMutableSet
:
(void)[types intersectsSet:types]; // -> no warning, this is expected
(BOOL)[types intersectsSet:types]; // (1) -> warning, this is expected
而且,如果我这样做:
[types intersectsSet:types]; // (2) -> no warning, UNEXPECTED
没有警告,甚至认为该方法被定义为- (BOOL)intersectsSet:(NSSet *)otherSet;
,所以人们会期望(1)和(2)是等价的。也许,与(2)相比,卑鄙的编译工具认为(1)具有更危险的性质,但是为什么这会影响警告,我问?
那么,如何使编译器在(2)中产生与(1)中相同的警告?
答案 0 :(得分:2)
编译器中的这种行为似乎是有意的(也是合理的。)
如果为所有ObjC消息发送表达式发出-Wunused-value
警告,其中该方法具有被隐式丢弃的返回值(即没有空置强制转换),那么它将是如此“繁琐”以至于它将呈现本身没用。换句话说,人们会为现有项目获得如此大量的警告,他们只会关闭警告,而不是使用(void)
强制转换来注释所有此类案例。
在将返回值强制转换为BOOL
的情况下发出警告 的事实是一个很好的意外,并且有意义:编译器然后假设它是合理的程序员确实对返回值感兴趣(因为为什么否则包含演员?)
cfe-dev mailing list上的Clang开发社区可能会为您提供有关此背后思考的更多信息。
我不知道有什么方法可以强制执行您想要的行为,但是对于您自己代码中的接口,您可以使用ObjC方法中的warn_unused_result
属性(或C函数)强制执行此警告声明:
@interface MyClass : NSObject
- (int) myReturnValueMustNotBeIgnored __attribute__((warn_unused_result));
@end