【问题标题】:Strange behavior of -Wunused-value warning-Wunused-value 警告的奇怪行为
【发布时间】:2014-01-13 04:55:28
【问题描述】:

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

    [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) 中相同的警告

【问题讨论】:

  • 编译器为Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)(即当前Xcode)
  • 您在 (1) 中看到了什么警告?我倾向于说编译器默认情况下不会担心未使用的返回类型,除非您显式转换它。

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


【解决方案1】:

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

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

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

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

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

@interface MyClass : NSObject
- (int) myReturnValueMustNotBeIgnored __attribute__((warn_unused_result));
@end

【讨论】:

  • 谢谢!很高兴听到这个属性。我试图明确放弃结果,因为这通常是一个错误(比如[NSArray sortedArrayUsingSelector:],我的意思是就地排序),但我理解现有代码库的意义。
猜你喜欢
  • 1970-01-01
  • 2019-06-14
  • 1970-01-01
  • 2020-11-02
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
  • 2011-12-08
  • 1970-01-01
相关资源
最近更新 更多