【问题标题】:A variable not detected as not used未检测为未使用的变量
【发布时间】:2010-11-01 16:24:48
【问题描述】:

我正在使用 g++ 4.3.0 编译这个例子:

#include <vector>

int main()
{
  std::vector< int > a;
  int b;
}

如果我以最大警告级别编译示例,我会收到一个警告,指出未使用变量 b

[vladimir@juniper data_create]$ g++ m.cpp -Wall -Wextra -ansi -pedantic
m.cpp: In function ‘int main()’:
m.cpp:7: warning: unused variable ‘b’
[vladimir@juniper data_create]$

问题是:为什么变量 a 没有报告为未使用? 我必须传递哪些参数才能获得变量 a 的警告?

【问题讨论】:

  • 某些 GCC 代码分析警告仅在您也使用优化时才有效(或效果更好),请尝试使用 -O2 或 -O3
  • @Laurynas Biveinis 我认为答案是正确的。在这种情况下,优化级别不起作用(确保我尝试过)。

标签: c++ gcc g++ gcc-warning


【解决方案1】:

理论上,std::vector&lt;int&gt; 的默认构造函数可能具有任意副作用,因此编译器无法确定删除 a 的定义是否会改变程序的语义。您只会收到内置类型的警告。

一个更好的例子是锁:

{
    lock a;
    // ...
    // do critical stuff
    // a is never used here
    // ...
    // lock is automatically released by a's destructor (RAII)
}

即使 a 在定义后从未使用过,删除第一行也是错误的。

【讨论】:

  • 优秀的答案/例子。不久前,在向客户解释相同的概念时,我使用了一个类似的示例。客户与我争吵,认为“锁定 a”将被优化掉,因为它“没有被使用”。我解释说它保证不会被消除(构造函数/析构函数的副作用 - 互斥体获取/释放)。我记得,我最终不得不在标准中找到支持我观点的章节。将尝试查找并回复。
【解决方案2】:

a 不是内置类型。您实际上是在调用 std::vector&lt;int&gt; 的构造函数并将结果分配给 a。编译器将此视为用法,因为构造函数可能有副作用。

【讨论】:

    【解决方案3】:

    a 在被声明为它的析构函数在其作用域结束时被调用后实际使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-23
      • 1970-01-01
      • 2012-01-27
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多