编译器警告(等级 1 和等级 4)C4700
使用了未初始化的局部变量“name”
备注
局部变量 name 在被分配值之前已被使用,即对其进行了读取。 在 C 和 C++ 中,默认情况下不会初始化局部变量。 未初始化的变量可以包含任何值,使用此类变量会导致未定义的行为。 警告 C4700 几乎总是指示存在可能导致程序产生不可预知的结果或崩溃的 bug。
若要解决此问题,可以在声明局部变量时对其进行初始化,或者在使用局部变量之前为其赋值。 函数可用于初始化作为引用参数传递的变量,或者在变量地址作为指针参数传递时初始化变量。
/sdl
(启用附加安全检查)编译器选项会将此警告升级为错误。
示例
在初始化变量 t
、u
和 v
之前使用这些变量时,此示例将生成 C4700,并显示可能生成的垃圾值类型。 变量 x
、y
和 z
不会导致警告,因为使用前已将其初始化:
// 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;
}
运行此代码时,t
、u
和 v
未初始化,s
的输出不可预知:
Value in s: 37816963
Value in w: 42