enum или определите, какой из них мне следует использовать? - PullRequest
8 голосов
/ 26 июня 2010

enum и #define, кажется, могут делать то же самое, например, для определения стиля ниже Поймите, что #define - это подстановка макроса для препроцессора компилятора. Есть ли обстоятельства, которые одно предпочтительнее другого?

typedef enum {
    SelectionStyleNone,
    SelectionStyleBlue,
    SelectionStyleRed
} SelectionStyle;

против

#define SELECTION_STYLE_NONE 0
#define SELECTION_STYLE_BLUE 1
#define SELECTION_STYLE_RED  2

Ответы [ 6 ]

11 голосов
/ 26 июня 2010

Никогда не используйте определения, если вы НЕ ДОЛЖНЫ иметь функциональность препроцессора. Для чего-то столь же простого, как целочисленное перечисление, используйте перечисление.

3 голосов
/ 26 июня 2010

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

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

2 голосов
/ 26 июня 2010

Короткий ответ: это, вероятно, не имеет большого значения.Эта статья дает довольно хороший длинный ответ:

http://www.embedded.com/columns/programmingpointers/9900402?_requestid=345959

1 голос
/ 26 июня 2010

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

1 голос
/ 26 июня 2010

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

0 голосов
/ 09 ноября 2012
#define DEFINED_VALUE 1
#define DEFINED_VALUE 2 // Warning
enum { ENUM_VALUE = 1 };
enum { ENUM_VALUE = 2 }; // Error

При использовании #define повышается вероятность появления тонких ошибок.

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