在特定变量上禁用GCC“可以使用未初始化”

时间:2011-02-22 16:23:39

标签: c++ gcc compiler-warnings

我在堆栈变量上收到此警告:

warning: object.member may be used uninitialized in this function

在这种情况下,我不希望强制初始化只是为了消除警告,因为它消耗CPU周期。变量是POD结构,因此memset上的{{1}}不是零成本。我可以验证变量从未使用过未初始化,所以我只想禁止它的警告。

一般情况下,我确实需要警告,而不是在这个特定情况下的特定变量。我该如何压制警告?


看起来pragma诊断是正确的方法,但它们需要相当新版本的GCC(4.6)

在该版本已知之前没有可接受的解决方案。

5 个答案:

答案 0 :(得分:33)

尝试这样做:

 #pragma GCC diagnostic ignored "-Wuninitialized"
        foo(b);         /* no diagnostic for this one */

这个pragma有三个有趣且有用的口味:warningerrorignored。有关其用法,请参阅6.56.10 Diagnostic Pragmas。链接说,

  

GCC允许用户有选择地   启用或禁用某些类型的   诊断,并改变那种   诊断。例如,a   项目的政策可能要求   所有源代码都使用-Werror编译但是   某些文件可能有例外   允许特定类型的警告。   或者,项目可以选择性地启用   诊断并将其视为错误   取决于哪些预处理器宏   已定义。

答案 1 :(得分:5)

@Nawaz已经按照具体要求回答了这个问题,但你是否认为你需要这个问题可能表明你的struct太早/在一个较少的嵌套范围内宣布你的struct?如果您可以在实际初始化它的位置声明{{1}}而不是之前声明它并在不同位置填充它,通常会更受欢迎。

此外,即使您现在可以验证它从未使用过未初始化,如果其他人在将来添加新代码路径并且未正确初始化该怎么办?如果你禁用警告,那么它将默默编译并可能以意想不到的方式中断。除非您能够证明初始化占用了可测量的程序CPU,否则最好先进行初始化。

答案 2 :(得分:4)

GCC区分未初始化和自我初始化,例如编译:

int main() {
   int i = i;
   return i;
}

gcc -Wall -Wextra除非您明确添加-Winit-self,否则不会发出任何警告,但我的快速测试会对其进行全面优化。

答案 3 :(得分:1)

被接受的答案有两个大问题,不仅仅需要评论。 首先,它会禁用整个文件的警告。如果该编译指示位于标头中,则可能更多。警告很有用,如果确实是误报,则应禁用一堆尽可能小的代码的警告。

然后,OP中的警告为“可能未初始化”,这是通过-Wmaybe-uninitialized(而不是-Wuninitialized)停用的。

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
function() or int variable;
#pragma GCC diagnostic pop

答案 4 :(得分:0)