未使用值警告:C与C ++使用gcc

4
是否有可能使gcc处理C语言中未使用值的警告,就像g++处理C++一样? 对于像p && ++*p;这样的指令,在C中会有警告,但在C ++中不会。 设置-wno-unused-value并不是真正的解决方案,因为它也会删除有用的警告(例如下面第2行中的警告)。 示例:
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; }
                    ^

1
gcc和*g++*在编译时警告方面基本上是相同的编译器,它们之间的区别在于C/C++。我编辑了问题以反映这一点,如果您认为我做得太过分,请随意撤销编辑。 - hyde
1
@EdHeal 这段代码很可能是为了演示问题而设计的MVCE。 - hyde
@marton-l-toth 我觉得我在测试中做错了什么。在我弄清楚我测试了什么之前,我删除了我的评论... - user743382
1
如果你将代码更改为 if (p) ++*p;,这会改变什么吗? - hyde
@hyde:在这种情况下,没有警告(当然,否则这个警告将是完全无用的 :)); 但是 - 正如您上面正确指出的那样 - 这旨在成为一个最小的示例,并且有时(特别是在使用预处理器时)我想“保持它是一个表达式”。 - marton-l-toth
显示剩余3条评论
1个回答

1
你可以通过将它们转换为void来手动删除它们。
void f(int *p) { (void)*p+5; }

但是这些警告是有原因的。它们实际上并没有做任何事情。这里没有发生任何副作用。因此调用这个函数的结果与不调用函数的结果相同。
通过调用函数 f(&x) 很可能会被合理的编译器完全优化掉。

2
我怀疑他们想隐藏 p && ++*p; 的警告,但是他们提供了 *p+5 作为他们仍然想看到的警告的示例。 - M.M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接