exponenta event banner

Возможно, неподходящий тип данных для выражения коммутатора

switch выражение имеет тип данных, отличный от char, short, int или enum

Описание

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

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

Риск

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

  • Логические типы, поскольку switch выражение с логическим типом можно заменить на if условие, которое вычисляет одно и то же выражение. A 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++
По умолчанию: Откл.
Синтаксис командной строки: INAPPROPRIATE_TYPE_IN_SWITCH
Воздействие: Низкий
Представлен в R2020a