Узнайте, есть ли элемент в enum - PullRequest
1 голос
/ 28 июля 2010

Есть ли в C простой способ выяснить, содержит ли перечисление определенный элемент?

Ответы [ 5 ]

11 голосов
/ 28 июля 2010

Нет. C не имеет отражения, а перечисления в основном просто ограниченные, связанные, интегральные константы.

2 голосов
/ 28 июля 2010

Да, есть способ проверить, является ли его перечисление частью, при условии, что перечисление инициализировано.

enum value
{
ENUM_MIN = 0,  
.
.
.
.
.
ENUM_MAX  
};

предположим, что у вас есть int x = -1;

if(x>ENUM_MIN && x< ENUM_MAX)
printf(" Part of enum");

Это не будет работать в следующем случае:

enum value
{
ENUM_MIN = 0,
ENUM_TWO =2,
.
.
.
ENUM_MAX
};

если значение x равно 1, то вы не можете использовать вышеуказанное решение.

2 голосов
/ 28 июля 2010

Не в общем случае. Некоторые люди принимают соглашение в соответствии с:

enum xxx
{
    xxx_min = 0,
    xxx_a   = 0,
    xxx_b   = 1,
    ...
    xxx_z   = 42,
    xxx_max = 42
};

#define check_enum(e,n) assert((n)>= e##_min && (n) <= e##_max)

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

1 голос
/ 28 июля 2010

На самом деле, может быть.

Если у вас есть перечисление вроде:

ErrorType { BAD_ERROR = 0, REALLY_BAD_ERROR=1, MAXNUM_ERROR }

Тогда всякий раз, когда вы получаете ErrorType, вы можете проверить, что:

int error;
error = REALLY_BAD_ERROR;
error = 6;
if (error < MAXNUM_ERROR) { /* error is valid */ }

Хотя что-то вроде хака. Работает только с последовательными перечислениями (если REALLY_BAD_ERROR было бы 3 и не было 2, это сломалось бы).

0 голосов
/ 28 июля 2010

По сути, единственный вариант - выполнить поиск в файле, в котором он объявлен.

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