编译器警告(等级 1 和等级 4)C4700

使用了未初始化的局部变量“name”

备注

局部变量 name 在被分配值之前已被使用,即对其进行了读取。 在 C 和 C++ 中,默认情况下不会初始化局部变量。 未初始化的变量可以包含任何值,使用此类变量会导致未定义的行为。 警告 C4700 几乎总是指示存在可能导致程序产生不可预知的结果或崩溃的 bug。

若要解决此问题,可以在声明局部变量时对其进行初始化,或者在使用局部变量之前为其赋值。 函数可用于初始化作为引用参数传递的变量,或者在变量地址作为指针参数传递时初始化变量。

/sdl(启用附加安全检查)编译器选项会将此警告升级为错误。

示例

在初始化变量 tuv 之前使用这些变量时,此示例将生成 C4700,并显示可能生成的垃圾值类型。 变量 xyz 不会导致警告,因为使用前已将其初始化:

// c4700.cpp
// compile by using: cl /EHsc /W4 c4700.cpp
#include <iostream>

// function takes an int reference to initialize
void initialize(int& i)
{
    i = 21;
}

int main()
{
    int s, t, u, v;   // Danger, uninitialized variables

    s = t + u + v;    // C4700: t, u, v used before initialization
    std::cout << "Value in s: " << s << std::endl;

    int w, x;         // Danger, uninitialized variables
    initialize(x);    // fix: call function to init x before use
    int y{10};        // fix: initialize y, z when declared
    int z{11};        // This C++11 syntax is recommended over int z = 11;

    w = x + y + z;    // Okay, all values initialized before use
    std::cout << "Value in w: " << w << std::endl;
}

运行此代码时,tuv 未初始化,s 的输出不可预知:

Value in s: 37816963
Value in w: 42