- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我只是花了一些时间来找出为什么可变集没有正确地与自身相交与另一组,使用
[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/
我正在学校作业中实现单例设计模式,这是我的类头文件: class Scheduler { public: static Scheduler * instance(); ~Schedul
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
最近我开始用C++编程了(我是Java出身的,有点零钱哈哈)。在 Windows 下一切正常。问题是我切换到 Linux,这就是我遇到编译器问题的地方。通常当你声明一个变量但没有被使用时,编译器会显示
我是 c++ 新手。 我想忽略警告 -Wunused-result 我猜是因为 -Wall 标志而弹出的。 我在网上搜索了一下,发现这是我可以通过声明一个pragma 来忽略它。我对 pragma 了
我有以下代码,在使用 gcc-4.6 编译时我收到警告: warning: variable ‘status’ set but not used [-Wunused-but-set-variable]
我将Wunused-parameter用于我的项目,但我想让它忽略3rd Party header (特定目录中的 header )。有什么办法可以用cmake设置它吗? 我目前正在像这样设置编译器选
我使用的是 GCC 版本 8.2在几段代码中,我使用了小函数。我对每一项功能都进行了测试(即 Unity 框架测试)。测试被定义为 #define 宏,测试非常具体的事情。例如,如果一个数字是正数
以下代码生成一个警告,指出未使用 temp(这是真的): #include int f() { return 5; } int main() { if(const int& temp = f
我只是花了一些时间来找出为什么可变集没有正确地与自身相交与另一组,使用 [someMutableSet intersectsSet:anotherSet]; // not the best i
我正在使用以下命令构建 C++14。 g++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp && ./a.out 如何将 -Wunused-vari
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我试图通过使用 GCC 的 -Wunused-function 标志在我的代码库中找到未使用的函数。 如我所料,使用 gcc -Wall -Wunused-function main.cpp 编译以下
这是我的代码: #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-variable" //__attribute
我使用 Ideone.com 编译了下面的代码,弹出了以下警告。 rtctimer.c: In function 'rtctimer_next_tick': rtctimer.c:87.7: warn
我已经搜索并没有真正找到并理解这个错误。奇怪的是,我只得到 c、d、e 的错误,而不是 a 和 b 或它们所有的错误。 程序是关于双链表的。 当我编译时会发生这种情况: gcc -Wall -g -c
我正在尝试使用Ubuntu将Cross编译为Android内核。 成功设置menuconfig后,并使用以下选项进行编译: make ARCH=arm CROSS_COMPILE="arm-bravo
所以我试图找出 while 循环和大多数 if 语句,所以我尝试制作这个小游戏,其中你有一定的生命值,怪物也有,只要你们都有超过 0 的生命值,循环就会运行,所以每个循环怪物都会对你造成 50 点伤害
main.cpp #include #include #include "steganography.h" // call steganography class const int arrSi
我有一个使用 SDL 的 C++ 项目。 我在编译时遇到这个错误,我不知道如何解决。 它说: Source/Classes/game.cpp:15:15: advarsel(this means 'w
我已经盯着它看了很久,但不明白为什么它会在 for 循环语句中给我一个警告。 //looks for a certain account by name in the provided list, r
我是一名优秀的程序员,十分优秀!