【问题标题】:Changing behavior of "uninitialized local variable" error改变“未初始化的局部变量”错误的行为
【发布时间】:2015-08-03 09:43:21
【问题描述】:

考虑以下代码:

#include "stdafx.h"
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
  int count123;
  for (int c = 0; c < 10; c++)
  {
    count123 += c;
  }

    return 0;
}

编译时我收到警告:warning C4700: uninitialized local variable 'count123' used

我知道 reason 正在声明 count123 但没有初始化它。

但是,如果我将 count123 声明为如下代码中的全局变量,警告就会消失。

#include "stdafx.h"
using namespace std;

int count123;
int _tmain(int argc, _TCHAR* argv[])
{

  for (int c = 0; c < 10; c++)
  {
    count123 += c;
  }

    return 0;
}

据我所知,将 count123 声明为全局变量会改变其范围,但如何消除警告?请指导。

【问题讨论】:

    标签: c++ global-variables


    【解决方案1】:

    全局变量初始化为零(顺便说一下,这同样适用于静态变量)。这就是您没有收到此消息的原因。

    这里是标准报价:

    8.5/10:每个静态存储持续时间的对象在程序启动时在任何其他初始化之前都进行零初始化 发生。在某些情况下,稍后会进行额外的初始化。

    【讨论】:

    • 感谢@Christophe 的回答。请澄清“以及静态”是什么意思
    • 他的意思是静态变量也初始化为零,
    • @Nishant 完全正确。我已经更改了措辞以避免混淆。该标准的确切术语是“具有静态存储持续时间的变量”,涵盖全局变量和静态变量。
    【解决方案2】:

    全局变量是静态存储变量,默认为零初始化。更多信息请看答案here

    【讨论】:

      【解决方案3】:

      全局变量总是用零初始化,想想一个全局指针,用一些随机值初始化,你在代码中错误地使用了它。 全局初始化使其为NULL,因此您可以检查并相应地使用。

      ——如果是指针类型,则初始化为空指针;

      ——如果它有算术类型,它被初始化为(正数或 无符号)零;

      【讨论】:

        【解决方案4】:

        默认情况下,全局变量用 初始化,因此您不会收到任何警告。

        您可以轻松获得C++ standards 的草稿,然后阅读8.5 Initializers 部分:

        10 [注意:在程序启动时,每个静态存储持续时间的对象都会在任何其他初始化发生之前进行零初始化。在某些情况下,稍后会进行额外的初始化。 ——尾注]

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-10-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多