“可能未初始化的局部变量”和处理所有可能性的开关

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 警告按预期工作吗?

Vla*_*cow 5

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)

在这种情况下,正如您自己指出的那样,您可以在默认标签之后包含一个带有断言检查的语句。

  • @NoSenseEtAl 从技术上讲,所有有效值都是底层类型所包含的值。这意味着您有可能返回未初始化的变量。 (2认同)