«потенциально неинициализированная локальная переменная» и переключатель, который обрабатывает все возможности - PullRequest
2 голосов
/ 06 февраля 2020

MSV C предупреждение для потенциально неинициализированных переменных не особенно хорошо, в частности, оно ложно утверждает, что я могу быть неинициализирован в этой программе:

#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);
}

предупреждение C4701: потенциально неинициализированная локальная переменная 'i' использовал

Я могу, очевидно, просто инициализировать i в 0 или отключить предупреждения с помощью паргм, но тогда это предупреждение не сработает, если я добавлю enum Blue, и я никогда не обработаю его в switch, и я хочу в этом случае его нужно запустить.

Есть ли способ заставить это предупреждение MSV C работать как положено?

Ответы [ 2 ]

5 голосов
/ 06 февраля 2020

Оператор switch не имеет метки по умолчанию. Таким образом, переменная i может быть неинициализирована.

Вы можете переписать функцию, например, например

int f(Color c){
    int i = 11;    // Color::Red

    switch(c){
        case Color::Green:
          i=22;
          break;
    }

    return i;
}

Другой подход - добавить метку по умолчанию, например,

int f(Color c){
    int i;

    switch(c){
        default: 
        case Color::Red:
          i=11;
          break;
        case Color::Green:
          i=22;
          breal;
    }

    return i;
}

В этом случае, как вы сами указали, вы можете включить утверждение с проверкой утверждения после метки по умолчанию.

1 голос
/ 06 февраля 2020

Как указано в моем комментарии выше, вы можете каким-то образом инициализировать i и больше не получать предупреждение C4701.

Но при добавлении цвета, который не обрабатывается в ваш оператор switch, предупреждение

C4061 "перечислитель" перечислитель "в переключателе перечисления" перечисление "явно не обрабатывается меткой регистра"

должно отображаться (когда включено) - сразу говорит, что пропустил

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...