Использование анонимных перечислений


какова цель анонима enum объявления, такие как:

enum { color = 1 };

почему бы просто не объявить int color = 1?

7 57

7 ответов:

перечисления не занимают никакого места и являются неизменяемыми.

если вы используете const int color = 1; тогда вы бы решить проблему изменчивости, но если кто-то взял адрес color (const int* p = &color;), то место для него должно быть выделено. Это не может быть большим делом, но если вы явно хочу люди, чтобы иметь возможность взять адрес color вы могли бы также предотвратить его.

также при объявлении констант поля в классе, то он должен быть static const (не верно для современного C++) и не все компиляторы поддерживают встроенную инициализацию статических членов const.


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

Это так называемый Трюк перечисления для объявление целочисленной константы времени компиляции. Его преимущество заключается в том, что он гарантирует, что никакая переменная не создается, и поэтому нет накладных расходов во время выполнения. Большинство компиляторов не вводят никаких накладных расходов с целочисленными константами в любом случае.

Если это старый код, то перечисление может быть использовано для "enum hack".

вы можете узнать больше о "enum hack", например, по этой ссылке: перечисление hack

(1) int color = 1;

color переменчива (случайно).

(2) enum { color = 1 };

color изменить нельзя.

другой вариант для enum есть

const int color = 1;  // 'color' is unmutable

и enum и const int предложите точно такую же концепцию; это вопрос выбора. Что касается распространенного мнения, что enums экономит место, IMO нет ограничений памяти, связанных с этим, компилятор достаточно умен, чтобы оптимизировать const int при необходимости.

[Примечание: Если кто-то пытается использовать const_cast<> на const int; это приведет к неопределенному поведению (что плохо). Однако то же самое невозможно для enum. Так что мой личный фаворит enum]

одно использование этого - когда вы делаете метапрограммирование шаблона, потому что объекты enum не являются lvalues, в то время как static const членов. Это также было распространенным обходным путем для компиляторов, которые не позволяли инициализировать статические интегральные константы в определении класса. Это объясняется в еще вопрос.

при использовании
enum {color = 1}
вы не используете никакой памяти это как
#define color 1

Если вы объявите переменную
int color=1 Тогда вы занимаете память для значения, которое не должно быть изменено.

Я не вижу, чтобы это упоминалось, другое использование-это охват ваших констант. В настоящее время я работаю над кодом, который был написан с помощью Visual Studio 2005, и теперь он портирован на android - g++. В VS2005 вы могли бы иметь такой код enum MyOpts { OPT1 = 1 }; и использовать его как MyOpts:: OPT1 - и компилятор не жаловался на это, даже если это не является действительным. g++ сообщает такой код как ошибка, поэтому одним из решений является использование анонимного перечисления следующим образом:struct MyOpts { enum {OPT1 =1}; };, и теперь оба компилятора счастливы.