【问题标题】:unused value warning: C vs C++ using gcc未使用值警告:使用 gcc 的 C 与 C++
【发布时间】: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; }
                    ^

【问题讨论】:

  • gccg++ 就编译时警告而言基本上是相同的编译器,区别在于 C/C++ 之间。我编辑了问题以反映这一点,如果您觉得我做得太过分,请随时回滚编辑。
  • @EdHeal 有问题的代码很可能是一个 MVCE,以演示问题。
  • @marton-l-toth 我认为我在测试中做错了。我删除了我的评论,直到我弄清楚我 做了什么 测试...
  • 如果您将代码更改为if (p) ++*p;,这会改变什么吗?
  • @hyde: 在这种情况下没有警告(当然,否则这个警告将完全无法使用:));但是——正如您在上面正确指出的那样——这只是一个最小的例子,有时(尤其是在使用预处理器时)我想“让它保持一个表达式”。

标签: c++ c gcc g++


【解决方案1】:

您可以通过将它们强制转换为 void 来手动移除它们。

void f(int *p) { (void)*p+5; }

但这些警告是有原因的。这些实际上并没有做任何事情。这里没有副作用发生。所以调用这个函数的结果和不调用函数的结果是一样的。

调用函数f(&x) 可能会被合理的编译器完全优化掉。

【讨论】:

  • 我怀疑他们想隐藏p && ++*p; 的警告,但他们提供了*p+5 作为他们仍然希望看到的警告示例
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-14
  • 2011-12-09
  • 1970-01-01
  • 2020-03-24
相关资源
最近更新 更多