ENUM постоянные вопросы - PullRequest
       27

ENUM постоянные вопросы

0 голосов
/ 21 сентября 2011

На этом сайте было опубликовано, как вы можете генерировать уникальные константы перечисления, выполнив следующие действия:

enum _EXAMPLE
{
    LEFT = 'left',
    RIGHT = 'right'
    //etc
};

Игнорируя вопрос действительности, как генерируются числа? Точнее, какая техника используется? Как я хотел бы попытаться построить функцию, которая эмулирует ее для коротких строк.

Ответы [ 2 ]

4 голосов
/ 21 сентября 2011

'left' является литералом , состоящим из нескольких символов (2.13.2 / 1 из C ++ 03), имеет тип int.

Это целое значение, определяемое реализациейна самом деле имеет.В частности, нет гарантии, что 'left' и 'right' не равны, так что вы можете проиграть, используя их в перечислении.

Например, GCC документирует егоповедение здесь: http://gcc.gnu.org/onlinedocs/gcc-4.6.1/cpp/Implementation_002ddefined-behavior.html#Implementation_002ddefined-behavior

'right' имеет пять символов, и очевидно, что для каждой 5-символьной строки невозможно иметь другое 32-битное значение.

1 голос
/ 21 сентября 2011

Многосимвольная константа - это то, чего вы обычно хотите избежать. Допустим, ваша система имеет прямой порядок с 32-разрядной архитектурой. В этом случае 'left' означает:

('l')+('e'<<8)+('f'<<16)+('t'<<24)

Обратите внимание , что для удобства чтения я опустил приведение к int за каждым из символов.

Таким образом, многосимвольная константа на самом деле является целым числом.

Однажды я использовал 'BM', чтобы проверить первые два байта изображения .bmp, которое я прочитал, чтобы проверить, правильный ли тип файла, но вскоре я решил, что лишние несколько символов, которые я сохраняю, не стоят. Если вы используете систему с прямым порядком байтов или ваш int имеет другой размер и т. Д. И т. Д., У вас возникнет проблема. Не говоря уже о раздражающем предупреждении компилятора.

Если у вас enum, обычно есть два случая:

Случай 1 , вам не нужны значения перечисления. В таком случае вы просто оставляете их. Первый из них станет нулевым, а остальное компилятор заполнит постепенно.

Случай 2 , вам нужны эти значения для умной цели. В этом случае вам нужно назначить их один за другим для вашей цели. Например, если вы хотите enum подсистем вашей программы и вам нужно включить, отключить их, вы можете иметь 1 переменную, которая является или (|) из enum значений, таких как:

enum subsystem
{
    SUBSYSTEM_1 = 0x0001,
    SUBSYSTEM_2 = 0x0002,
    SUBSYSTEM_3 = 0x0004,
    SUBSYSTEM_4 = 0x0008,
    SUBSYSTEM_5 = 0x0010,
    /* etc */
};

(забавный факт, знаете ли вы, что C ++ принимает дополнительные , после последнего элемента enum?)

Ни в одном из случаев вам не понадобится странное значение, соответствующее 'left'. Если вы думаете, что это делает код понятным для чтения, вы можете быть уверены, что имя константы (LEFT), безусловно, достаточно.

...