編譯器警告 (層級 1 和層級 4) C4700
未初始化的局部變數 『name』 已使用
備註
局部變數 名稱 已在 指派值之前使用,也就是讀取自變數名稱。 在 C 和 C++ 中,本機變數預設不會初始化。 未初始化的變數可以包含任何值,而且其使用會導致未定義的行為。 警告 C4700 幾乎一律表示可能導致程式無法預期的結果或當機的錯誤。
若要修正此問題,您可以在宣告局部變數時初始化局部變數,或在使用它們之前指派值給它們。 函式可用來初始化當做參考參數傳遞的變數,或當其位址當做指標參數傳遞時。
/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