Разница между перечислением и определением утверждений - PullRequest
45 голосов
/ 26 сентября 2008

В чем разница между использованием оператора define и оператора enum в C / C ++ (и есть ли разница при использовании их с C или C ++)?

Например, когда следует использовать

enum {BUFFER = 1234}; 

над

#define BUFFER 1234   

Ответы [ 18 ]

1 голос
/ 11 августа 2017

Enum:

1. Обычно используется для нескольких значений

2. В enum есть две вещи, одна из которых - это имя, а другая - значение имени, имя должно различаться, но значение может быть тем же. Если мы не определяем значение, то первое значение имени перечисления равно 0, второе значение равно 1 и т. д., если явно не указано значение.

3. Они могут иметь тип, и компилятор может проверять их тип

4. Упрощение отладки

5. Мы можем ограничить область его применения до класса.

Определение:

1. Когда мы должны определить только одно значение

2. Обычно она заменяет одну строку на другую.

3. Это область действия глобальная, мы не можем ограничивать область действия

В целом мы должны использовать enum

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

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

Более того, при использовании отладчика у вас есть доступ к значениям литералов enum. Это не всегда так с # define.

1 голос
/ 26 сентября 2008

Если у вас есть группа констант (например, «Дни недели»), то перечисления предпочтительнее, потому что это показывает, что они сгруппированы; и, как сказал Джейсон, они безопасны от типов. Если это глобальная константа (например, номер версии), это больше, для чего вы бы использовали #define; хотя это предмет многих споров.

1 голос
/ 26 сентября 2008

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

1 голос
/ 29 сентября 2008

Другое преимущество перечисления над списком определений состоит в том, что компиляторы (по крайней мере, gcc) могут генерировать предупреждение, когда не все значения проверены в операторе switch. Например:

enum {
    STATE_ONE,
    STATE_TWO,
    STATE_THREE
};

...

switch (state) {
case STATE_ONE:
    handle_state_one();
    break;
case STATE_TWO:
    handle_state_two();
    break;
};

В предыдущем коде компилятор может генерировать предупреждение о том, что не все значения перечисления обрабатываются в коммутаторе. Если бы состояния были выполнены как # define, это было бы не так.

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

перечисления больше используются для перечисления некоторого набора, например, дней в неделе. Если вам нужно только одно постоянное число, const int (или удвоенный и т. Д.) Будет определенно лучше, чем enum. Лично мне не нравится #define (по крайней мере, не для определения некоторых констант), потому что это не дает мне безопасность типов, но вы, конечно, можете использовать его, если он вам больше подходит.

0 голосов
/ 20 июля 2016

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

Например:


    #define OPT_X1 1 /* introduced in version 1 */
    #define OPT_X2 2 /* introduced in version  2 */

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


    #ifdef OPT_X2
    int flags = OPT_X2;
    #else
    int flags = 0;
    #endif

Во время перечисления это невозможно без механизма обнаружения функций времени выполнения.

0 голосов
/ 23 июня 2014

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

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

...