奇怪的行为 - 无用值警告

时间:2014-01-13 04:55:29

标签: objective-c xcode clang compiler-warnings unused-variables

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

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

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

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