【发布时间】:2016-07-23 09:01:33
【问题描述】:
是否有可能让 gcc 处理 C 的未使用值警告,就像 g++ 处理 C++ 一样?对于 C 中的 p && ++*p; 之类的指令,会有一个警告,但对于 C++ 则没有。设置-wno-unused-value 并不是真正的解决方案,因为它还会删除有用的警告(如下面的第 2 行)。示例:
$ (gcc --version|head -1; ls -l qwe.*; cat qwe.x; echo $sep; gcc -c -O2 -Wall qwe.c; echo $sep; g++ -c -O2 -Wall qwe.cc) 2>&1 | sed 's/^/ /'
gcc (Debian 4.9.2-10) 4.9.2
lrwxrwxrwx 1 tml tml 5 Jul 23 10:12 qwe.c -> qwe.x
lrwxrwxrwx 1 tml tml 5 Jul 23 10:12 qwe.cc -> qwe.x
-rw-r--r-- 1 tml tml 1384 Jul 23 10:49 qwe.o
-rw-r--r-- 1 tml tml 55 Jul 23 10:49 qwe.x
void g(int *p) { p && ++*p; }
void f(int *p) { *p+5; }
-------------------------------------------
qwe.c: In function ‘g’:
qwe.c:1:20: warning: value computed is not used [-Wunused-value]
void g(int *p) { p && ++*p; }
^
qwe.c: In function ‘f’:
qwe.c:2:18: warning: statement with no effect [-Wunused-value]
void f(int *p) { *p+5; }
^
-------------------------------------------
qwe.cc: In function ‘void f(int*)’:
qwe.cc:2:20: warning: statement has no effect [-Wunused-value]
void f(int *p) { *p+5; }
^
【问题讨论】:
-
gcc 和 g++ 就编译时警告而言基本上是相同的编译器,区别在于 C/C++ 之间。我编辑了问题以反映这一点,如果您觉得我做得太过分,请随时回滚编辑。
-
@EdHeal 有问题的代码很可能是一个 MVCE,以演示问题。
-
@marton-l-toth 我认为我在测试中做错了。我删除了我的评论,直到我弄清楚我 做了什么 测试...
-
如果您将代码更改为
if (p) ++*p;,这会改变什么吗? -
@hyde: 在这种情况下没有警告(当然,否则这个警告将完全无法使用:));但是——正如您在上面正确指出的那样——这只是一个最小的例子,有时(尤其是在使用预处理器时)我想“让它保持一个表达式”。