我在堆栈变量上收到此警告:
warning: object.member may be used uninitialized in this function
在这种情况下,我不希望强制初始化只是为了消除警告,因为它消耗CPU周期。变量是POD结构,因此memset
上的{{1}}不是零成本。我可以验证变量从未使用过未初始化,所以我只想禁止它的警告。
一般情况下,我确实需要警告,而不是在这个特定情况下的特定变量。我该如何压制警告?
看起来pragma诊断是正确的方法,但它们需要相当新版本的GCC(4.6)
在该版本已知之前没有可接受的解决方案。
答案 0 :(得分:33)
尝试这样做:
#pragma GCC diagnostic ignored "-Wuninitialized"
foo(b); /* no diagnostic for this one */
这个pragma有三个有趣且有用的口味:warning
,error
,ignored
。有关其用法,请参阅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)