Как проверить значение enum, прочитанное из файла? - PullRequest
2 голосов
/ 17 апреля 2019

Если я читаю двоичные значения из файла в C, то целое число, которое должно быть членом перечисления, можно проверить вручную, просматривая само перечисление и проверяя, что целое число является одним из этих значений, но это кажется несколько утомительным процессом. Если я просто приведу значение read к перечислению, то я предполагаю, что при неправильном значении произойдет какая-то ошибка времени выполнения.

Есть ли лучший способ проверки перечисления, чем выполнение ручного цикла проверки?

Обратите внимание, что в моем случае рассматриваемые перечисления не обязательно имеют последовательные значения, поэтому проверка min / max не является решением.

Ответы [ 2 ]

4 голосов
/ 17 апреля 2019

enum в C работает как целое число, поэтому его можно принудительно ввести в любое значение с помощью функции чтения любого типа, получающей указатель или непосредственно приводящей его к целочисленным типам.

Если перечисление имееттолько последовательные значения, некоторые программы имеют значение enum max.Они могут иметь явные значения или неявные значения, которые всегда начинаются с 0 и увеличиваются последовательно.Таким образом, они могут просто проверить, находится ли значение в допустимом диапазоне (от 0 до max - 1), а не проверять его для каждого допустимого значения.

typedef enum foo { 
    foo_a,
    foo_b,
    foo_c,
    foo_max //last
} foo;
int main(void)
{
    foo x = (foo)88; // from somewhere
    if (x >= 0 && x < foo_max)
        printf("valid\n");
    else printf("invalid\n");
}
4 голосов
/ 17 апреля 2019

В C все enum s на самом деле являются целочисленными типами.

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

* 1008.* Если вы осторожны и настроили метки enum таким образом, чтобы они были последовательными (значение по умолчанию является последовательным от 0), это простой случай проверки, находится ли значение из файла в этом диапазоне.Иначе да, это утомительно.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...