Possibly inappropriate data type for switch expression

switch выражение имеет тип данных кроме char, короткого, международного или перечислимого

Описание

Этот дефект происходит когда switch выражение имеет тип данных кроме char, short, int или enum.

Средство проверки отмечает другие целочисленные типы данных, такие как булевы типы, битовые поля или long.

Риск

Это предпочтено, чтобы использовать char, short, int или enum в switch выражения вместо:

  • Булевы типы, потому что switch выражение с булевым типом может быть заменено if условие, которое выполняет то же выражение. switch выражение слишком тяжело для простого потока управления на основе булева условия.

  • Типы битового поля, потому что типы битового поля подразумевают ограничения памяти. Если вы только хотите задать переменную с конечным числом значений, перечисления предпочтены, поскольку они включают более читаемый код.

  • Типы с размером, больше, чем int потому что switch выражение, которое требует типа с размером, больше, чем int подразумевает слишком много меток случая и может быть возможно перепроектирован.

Типы нецелого числа не поддерживаются в switch выражения.

Фиксация

Используйте переменные char, short, int или enum типы данных в switch выражения.

Примеры

развернуть все

#ifndef __cplusplus
#include <stdbool.h>
#endif

void func(bool s) {
    switch(s) {
        case 0: //Perform some operation
        break;
        case 1: //Perform another operation
        break;
    }
}

В этом примере C++ средство проверки отмечает использование bool переменная в switch выражение.

Коррекция – использует if Условие вместо switch

Если switch выражение действительно требует двух значений, используйте if оператор вместо этого.

#ifndef __cplusplus
#include <stdbool.h>
#endif


void func(bool s) {
    if(s) {
        //Perform some operation
        }
    else {
        //Perform another operation
        }
}
Коррекция – использует другой тип данных

Если вы ожидаете добавлять больше меток в switch выражение позже, используйте тип данных, который может вместить большие значения.

void func(char s) {
    switch(s) {
        case 0: //Perform some operation
        break;
        case 1: //Perform another operation
        break;
        default: //Default behavior
    }
}

Проверяйте информацию

Группа: Хорошая практика
Язык: C | C++
Значение по умолчанию: Off
Синтаксис командной строки: INAPPROPRIATE_TYPE_IN_SWITCH
Удар: низко
Введенный в R2020a