Ошибка сравнения типа перечисления - PullRequest
2 голосов
/ 20 декабря 2010
typedef enum {
  TYPE_A = 0,
  TYPE_B,
  TYPE_C
} OBJTYPE;

Предположим, есть перечислимый тип выше.
Я использую arm-g ++ для своей работы.

И некоторый макрос для любого типа определяется так:

#define ANY_TYPE ((OBJTYPE)-1)

Но следующее сравнение было ложным, как я тестировал:

if (param->type == ANY_TYPE) something();
else error();

param-> type был установлен как ANY_TYPE, а его тип был OBJTYPE. Я зарегистрировал их обоих с "% d", и они отображались как 255. Но это ложь, и произошла ошибка.

Эта проблема не была вызвана RVCT (коммерческим компилятором arm).
Почему не получается?

Ответы [ 3 ]

3 голосов
/ 20 декабря 2010

-1 является недопустимым значением для вашего перечисления.

Стандарт языка (7.2 Объявления перечисления) гласит:

Для перечисления, где e min является наименьшим перечислителем, а e max является наибольшим, значения перечисления являются значениями базового типа в диапазоне от b min до b max ,где b min и b max - это, соответственно, наименьшее и наибольшее значения наименьшего битового поля, в котором могут храниться e min и e max.

В соответствии с этим допустимыми значениями являются 0, 1, 2 и 3 (те значения, которые могут быть представлены двумя битами).Вы должны добавить перечислитель ANY_TYPE, чтобы использовать его.

0 голосов
/ 20 декабря 2010

почему вы не используете

typedef enum {
  ANY_TYPE = -1,
  TYPE_A = 0,
  TYPE_B,
  TYPE_C
} OBJTYPE;

Я думаю, что тогда у вас не будет этой ошибки.

0 голосов
/ 20 декабря 2010

Я зарегистрировал их обоих с "% d" и они были показаны как 255. Но это false и произошла ошибка.

Звучит так, как ваш компилятор назначил ANY_TYPE для param-> type как 8-битное целое число Попробуйте использовать что-то вроде

#define ANY_TYPE ((OBJTYPE)(int)-1)

Или, в качестве альтернативы, приведите обе стороны сравнения к int.

...