gpt4 book ai didi

objective-c - -Wunused-value 警告的奇怪行为

转载 作者:搜寻专家 更新时间:2023-10-30 20:18:17 30 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

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

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

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

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

关于objective-c - -Wunused-value 警告的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21084138/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com