правильное соглашение о присвоении значений элементам enum - PullRequest
0 голосов
/ 20 сентября 2011
gcc (Ubuntu/Linaro 4.6.1-9ubuntu2) 4.6.1
c89

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

Я часто видел шестнадцатеричный формат, и я спрашиваю себя, есть ли причина для этого?

В моем исходном коде у меня есть несколько типов перечислений, поэтому я сделал следующее:

typedef enum transfer_states_e {
    /* Call transfer bind/supervised */
    STATE_TRANSFER_IDLE     = 0x1,

    STATE_INIT_BLIND        = 0x2,
    STATE_INIT_SUPERVISED   = 0x3,

    STATE_INVOKE_BLIND      = 0x4,
    STATE_INVOKE_SUPERVISED = 0x5
} transfer_states_e;

typedef enum states_e {
    /* Initial state */
    STATE_IDLE = 0x6,
    STATE_NULL = 0x7,
    .
    .
    .
} states_e;

Большое спасибо за любые предложения,

Ответы [ 2 ]

3 голосов
/ 20 сентября 2011

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

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

1 голос
/ 20 сентября 2011

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

Если у вас действительно есть веская причина для необходимости непересекающихся наборов значений в перечислениях, то, я думаю, вам следует определить обычный 'последнийчлен каждого перечисления, и используйте его для запуска следующего:

typedef enum transfer_states_e {
    /* Call transfer bind/supervised */
    STATE_TRANSFER_IDLE = 1,
    STATE_INIT_BLIND,
    STATE_INIT_SUPERVISED,
    STATE_INVOKE_BLIND,
    STATE_INVOKE_SUPERVISED,
    STATE_TRANSFER_LAST = STATE_INVOKE_SUPERVISED
} transfer_states_e;

typedef enum states_e {
    /* Initial state */
    STATE_IDLE = STATE_TRANSFER_LAST + 1,
    STATE_NULL,
    .
    .
    .
    STATE_LAST = ...
} states_e;

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

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