3

我只是花了一些时间找出为什么一个可变集合没有正确地与另一个集合相交,使用

    [someMutableSet intersectsSet:anotherSet]; // not the best idea

当然,正确的语法是[someMutableSet intersectSet:anotherSet]和上面一行的意思不同——它是一个返回值BOOL类型的方法调用。

由于我-Wall -Wextra启用了选项,因此应该将其视为警告。但它没有被抓住。我通过尝试进一步调查,哪里typesNSMutableSet

    (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) 是等价的。也许恶意编译工具认为(1)与(2)相比具有更危险的性质,但我问为什么这会影响警告?

那么,如何使编译器在 (2) 中产生与 (1) 中相同的警告

4

1 回答 1

2

编译器中的这种行为似乎是有意的(并且是合理的。)

如果-Wunused-value针对所有 ObjC 消息发送表达式发出警告,其中该方法具有隐式丢弃的返回值(即没有 void 强制转换),那么它会非常“健谈”,以至于它会使自己变得无用。换句话说,人们会收到大量现有项目的警告,以至于他们会简单地关闭警告,而不是使用(void)强制转换注释所有此类案例。

在返回值被转换为的情况下发出警告事实BOOL是一个很好的惊喜,并且是有道理的:编译器然后假设程序员确实对返回值感兴趣是合理的(因为为什么要包含投掷?)

cfe-dev 邮件列表上的 Clang 开发社区可能会为您提供有关其背后想法的更多信息。

我不知道有什么方法可以强制执行您想要的一般行为,但是对于您自己代码中的接口,您可以通过使用warn_unused_resultObjC 方法(或 C 函数)声明中的属性来强制执行此警告:

@interface MyClass : NSObject
- (int) myReturnValueMustNotBeIgnored __attribute__((warn_unused_result));
@end
于 2014-05-12T11:43:57.243 回答