给出以下 C 代码:
#include <stdbool.h>
int main (void)
{
true;
return 0;
}
我预计
-Wunused-value
会在第 5 行引起警告: true;
-Wunused -Wall -Wextra
并没有抓住它。
为了比较,像这样:
#define TRUE 1
int main (void)
{
TRUE;
return 0;
}
或者这个:
int main (void)
{
1;
return 0;
}
将触发正确的警告(GCC 14.2):
<source>: In function 'main':
<source>:3:5: warning: statement with no effect [-Wunused-value]
3 | 1;
| ^
所以我开始挖掘;我认为这可能是 GCC 的回归。
我从 GCC 14.2 降到了非常非常旧的版本
似乎 GCC 3.4.6 是最后一个按预期出现警告的版本。
我想过向 GCC 报告此事,但后来我检查了 Clang
自 Clang 3.0.0 起,Clang 也不会产生任何关于此的警告
参见:https://godbolt.org/z/T361d3ad6
虽然我能够在 GCC 邮件列表上找到类似的错误,例如
https://gcc.gnu.org/pipermail/gcc-bugs/2021-November/765405.html
我无法相信两个主要的编译器供应商在很长一段时间内都存在相同的错误。
我怀疑这种情况正在发生,因为
true
是在libc头文件中定义的宏发生这种情况有什么理由吗?
或者这只是编译器中应该报告的错误/回归?
警告不会显示,因为宏
true
是在系统标头中定义的,并且系统标头中的警告通常会被抑制。
如果添加
-Wsystem-headers
标志,您会看到警告。