NoS*_*tAl 2 c++ warnings visual-c++ visual-studio-2019
MSVC 对潜在未初始化变量的警告并不是特别好,特别是它错误地声称 i 可以在此程序中未初始化:
#include<cstdlib>
enum class Color{
Red,
Green
};
int f(Color c){
int i;
switch(c){
case Color::Red:
i=11;
case Color::Green:
i=22;
};
return i;
}
int main(){
return f(rand()?Color::Red : Color::Green);
}
Run Code Online (Sandbox Code Playgroud)
警告 C4701:使用了可能未初始化的局部变量“i”
我显然可以将 i 初始化为 0 或使用 pargmas 禁用警告,但是如果我添加 enum Blue 并且我从未在 switch 中处理它并且我希望它在这种情况下触发,则该警告不会触发。
有什么办法可以使这个 MSVC 警告按预期工作吗?
switch 语句没有默认标签。所以确实变量 i 可以未初始化。
您可以重写该函数,例如
int f(Color c){
int i = 11; // Color::Red
switch(c){
case Color::Green:
i=22;
break;
}
return i;
}
Run Code Online (Sandbox Code Playgroud)
另一种方法是添加默认标签,例如
int f(Color c){
int i;
switch(c){
default:
case Color::Red:
i=11;
break;
case Color::Green:
i=22;
breal;
}
return i;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,正如您自己指出的那样,您可以在默认标签之后包含一个带有断言检查的语句。
| 归档时间: |
|
| 查看次数: |
171 次 |
| 最近记录: |