Что касается использования перечислений в C: возможно ли изменить значение членов перечислений? - PullRequest
1 голос
/ 01 декабря 2011

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

Например, скажем, у меня есть:

enum yourcolor{red = 43, blue = 54, green = 89};

enum yourcolor blue-green = red*blue*green;

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

Я думал что-то вроде:

yourcolor.red = 56; etc...

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

Любая помощь будет оценена.

Ответы [ 5 ]

2 голосов
/ 01 декабря 2011

Короткий ответ «нет» - вы не можете изменить значение константы перечисления после того, как она была определена.

Семантически, в этом нет никакого смысла. Весь смысл использования перечисляемых типов состоит в том, чтобы абстрагироваться от базового представления - вам важно, чтобы цвет был red, а не 43 или 56 или что-то еще. Другими словами, если имеет значение , что red равно 43 или 56, то вам не следует использовать перечисление.

Когда вы создаете объект перечислимого типа, вы в основном говорите, что объект может принимать только одно из перечисленных значений; это может быть red или blue или green. Если вы хотите представить вторичные цвета, вы должны определить константы перечисления для этих вторичных цветов. Вы можете определить эти вторичные выражения в терминах выражений, содержащих основные цвета. Ниже приведено одно из многих возможных кодировок:

enum color {black   = 0x00,              // binary 0000
            red     = 0x01,              // binary 0001
            blue    = 0x02,              // binary 0010
            green   = 0x04,              // binary 0100
            magenta = red | blue,        // binary 0011
            cyan    = blue | green,      // binary 0110 
            yellow  = red | green,       // binary 0101
            white   = red | blue | green // binary 0111
};

Показанные кодировки удобны; они показывают, как вторичные цвета строятся из праймериз. Они также полностью произвольно; Вы можете определить тип как

enum color {black, red, blue, green, magenta, cyan, yellow, white};

и не беспокойтесь вообще о базовых значениях (которые будут 0, 1, 2, 3, 4, 5, 6 и 7 соответственно).

Создавая этот тип, вы подразумеваете, что объект типа enum color должен только принимать одно из значений black, red, blue, green, magenta, cyan, yellow или white (независимо от базового целочисленного значения).

Конечно, C не совсем строг в этом: объект перечисляемого типа может содержать произвольное целочисленное значение, даже если это значение не появляется в списке констант перечисления. Но тем самым вы нарушение концептуальной модели, подразумеваемой типом.

2 голосов
/ 01 декабря 2011

Нет, это невозможно. Ну, это будет работать в разных единицах перевода, хотя, вероятно, это не то, что вам нужно.

Вы можете использовать переменную, хотя:

typedef int color;
color red = 43;
color blue = 54;
color green = 89;

Их можно изменить.

2 голосов
/ 01 декабря 2011

Нет.Идентификаторы в enum объявлены как константы.

С C99 (выделение мое):

Идентификаторы в списке перечислителя: объявлены как константы , которые имеют тип int и могут появляться везде, где это разрешено

Обратите внимание, далее в том же разделе (курсив мой):

Каждый перечисляемый типдолжен быть совместим с целочисленным типом.Выбор типа определяется реализацией , но должен быть способен представлять значения всех членов перечисления.

В целом, я бы поставил под сомнение мотивацию длятакая особенность.Перечисление , по определению, является списком complete всех членов некоторого набора, значения которого, вероятно, не должны изменяться в обычных обстоятельствах.

0 голосов
/ 01 декабря 2011

Не похоже, что это имело бы смысл.Перечисления на самом деле являются константами, и я предполагаю, что они жестко запрограммированы в машинных инструкциях.

Это означает, что программа не может знать, когда они изменяются.Если вы изменили его в программе, которая не является линейной, что произойдет, если вы отскочите назад?Как в цикле или операторе goto?

0 голосов
/ 01 декабря 2011

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

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