gcc - 删除"在此函数中使用未初始化"警告

dim*_*mba 7 c++ linux gcc

在向gcc(4.4.6)添加-O2 -Wall标志后清除代码.我在一些遗留代码中有很多警告.这是一个非常简化的版本来演示问题:

 1 #include <cstdio>
  2
  3 bool init(bool& a)
  4 {
  5     return true;
  6 }
  7
  8 int main()
  9 {
 10     bool a;
 11
 12     if (!init(a))
 13     {
 14         return 1;
 15     }
 16
 17     if (a)
 18     {
 19         printf("ok\n");
 20     }
 21 }
Run Code Online (Sandbox Code Playgroud)

当它编译为"gcc main.cpp -O2 -Wall"时,我收到:

 main.cpp:17: warning: `a' is used uninitialized in this function
Run Code Online (Sandbox Code Playgroud)

在实际代码中,init()仅在初始化"a"时才返回true,因此未初始化的"a"实际上没有使用它.

可以做Whan修复警告.

Zac*_*ler 11

更改bool a;bool a = false;将删除此警告.

编译器不知道init(a)是为了'初始化',它只看到程序试图用未初始化的变量调用函数.

  • 但是`init()`永远不会在其参数中写入任何内容,因此编译器是正确的,不会发生任何初始化. (5认同)

Dan*_*rey 10

如果您不想使用某个值初始化变量,可以使用GCC的诊断编译指示:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wuninitialized"
   if( a )
#pragma GCC diagnostic pop
Run Code Online (Sandbox Code Playgroud)

如果您的代码在初始化所有内容时都存在性能问题,这可能会很方便.当然,在你的例子中,使用bool a = false;显然是更好的选择.


fen*_*fen 7

int main()
{
    bool a = false;
    ...
Run Code Online (Sandbox Code Playgroud)

始终初始化所有变量!

  • 我不同意.初始化*不应*需要初始化的内容可能导致隐藏错误.这可能是一个长期的咆哮,但我会在这里留下它,对于局部变量的特殊情况:假设你定义一个局部*将*设置在一个分支或另一个'if'结构下面.让它在decl处未初始化.意味着如果您未能在所有分支中设置它,您将收到警告.将它初始化为0(作为一般惯例,没有思考)将抑制该警告,因此编译器将不再帮助您(通过缺少警告)知道它始终设置. (8认同)

tri*_*tan 5

将-Wno-uninitialized添加到您的编译选项中

  • -1。禁用编译警告,在这种情况下,该警告会向程序员显示代码中存在实际问题(在这种情况下,是由未定义的行为引起的),绝对不是一个好习惯。 (2认同)
  • 这是关于如何抑制该警告的答案,而不是良好实践的答案。 (2认同)