2013-07-26 4 views
1

Я только что прочитал некоторый код, подобный следующему:C++ используется вместо константного значения

enum 
{ 
    width = 123, 
    height = 321, 
    position_x = 234 
    position_y = 432 
}; 

... 

Widget* w = CreateWidget(position_x, position_y, width, height); 

Есть ли какая-либо причина использовать перечисление в этом случае вместо макросов или константных значений?

EDIT: Правильно ли использовать перечисление следующим образом? Является ли это использование рассмотрением какого-либо злоупотребления в использовании перечислений?

ответ

6

Существует множество причин не использовать макросы. Перечисление в вопросе равно с областью и не будет мешать тому же идентификатору, который используется в разных областях, поэтому вы можете, например, определить член position_x в классе без макроса, определяющего определение вашего класса.

Сравнивая enum с константой, есть люди, которые предпочитают перечисление, поскольку гарантировано, что он не добавит двоичный размер исполняемого файла. В случае константы он может добавить (бит, ну, собственно, int) в размер двоичного файла.

3

Нет, нет особых причин, чтобы выбрать enum над макросами или const int значений в этом случае.

Редакционное примечание: Это, конечно, юридический код для использования enum таким образом, но он является немного странно, глядя на первый взгляд.

+6

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

+0

В общем случае, да. В этом конкретном примере трудно сказать, почему определение препроцессора было бы проблемой. –

+1

Это было бы проблемой даже здесь: препроцессор не ограничивается правилами определения языка, поэтому имена не могут использоваться ни для чего, кроме констант в любом контексте. (Конечно, вы можете обойти это с помощью обычного соглашения об особых соглашениях об именах для макросов.) –

0

В данном конкретном случае не существует какого-либо реального решающего фактора при выборе между enum и постоянными значениями. Оба лучше, чем макрос, и макросов следует избегать в целом.

В более общем плане, есть некоторые дифференцирующие аспекты между enum и константами:

  1. enum s имеют различные типы, которые более выразительным, чем целые значения
  2. Вы можете взять адрес постоянной, но вы не можете взять адрес enum
0

Возможно, более удобно использовать enum, чем static const int в качестве члена класса.

class A 
{ 
    static const int Foo = 42; 
    // may have to define A::Foo somewhere 
}; 

class B 
{ 
    enum { Foo = 42 }; 
    // done 
}; 
+0

Вам нужно будет только определить переменную, если она * odr-used * (грубо говоря, если вы берете ее адрес). Если вам не нужно это делать, то это не менее удобно, чем 'enum'; и если да, то вы не можете использовать 'enum' в любом случае. –

+0

@MikeSeymour: если вы передадите его функции с параметром 'const int &', вы используете odr-use, но вы все равно можете использовать 'enum' в этом случае. –

Смежные вопросы