Подтвердить что ты не робот

Подпись enum в C/C99/С++/С++ x/GNU C/GNU C99

Является ли enum типом подписанным или неподписанным? Является ли значение переписей отличным от C/C99/ANSI C/С++/С++ x/GNU C/GNU C99?

Спасибо

4b9b3361

Ответ 1

Гарантируется, что перечисление будет представлено целым числом, но фактический тип (и его подпись) зависит от реализации.

Вы можете заставить перечисление быть представленным подшитым типом, указав один из счетчиков отрицательное значение:

enum SignedEnum { a = -1 };

В С++ 0x может быть явно указан базовый тип перечисления:

enum ShortEnum : short { a };

(С++ 0x также добавляет поддержку индексированных областей)

Для полноты я добавлю, что в языке программирования C, 2nd ed., перечисления указаны как имеющие тип int (стр. 215). K & R не является стандартом C, поэтому он не является нормативным для компиляторов ISO C, но он предшествует стандарту ISO C, поэтому он по крайней мере интересен с исторической точки зрения.

Ответ 2

Это старый вопрос... но я только что узнал об этом:

typedef unsigned ENUMNAME;  // this makes it unsigned in MSVC C 2015
typedef enum {v0, v1, v2, v3} ENUMNAME;

Вы можете использовать его как 2-битный беззнаковый индекс, например:

typedef struct {
  ENUMNAME i:2;
} STRUCTNAME;

Пробовал в GCC ARM - не работает.
Кроме того, WinDbg показывает STRUCTNAME.i как число, а не как v0-v3.