пересчет счетчика - PullRequest
       0

пересчет счетчика

1 голос
/ 08 апреля 2010

gcc 4.1.2 c99

У меня есть следующие перечисления в этом файле ccsmd.h:

enum options_e
{
    acm = 0,
    anm,
    smd,
    LAST_ENTRY,

    ENTRY_COUNT = LAST_ENTRY
};

enum function_mode_e
{
    play = 0,
    record,
    bridge,
    LAST_ENTRY,

    ENTRY_COUNT = LAST_ENTRY
};

Сообщения об ошибках:

error: redeclaration of enumerator ‘LAST_ENTRY’
error: previous definition of ‘LAST_ENTRY’ was here
error: redeclaration of enumerator ‘ENTRY_COUNT’
error: previous definition of ‘ENTRY_COUNT’ was here

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

1 Ответ

5 голосов
/ 08 апреля 2010

Значения перечисления существуют в том же пространстве имен, что и перечисление. То есть, что касается LAST_ENTRY, он похож (используется очень свободно здесь) на:

enum options_e { /* ... */ );

// for the LAST_ENTRY value in options_e
static const int LAST_ENTRY = /* whatever */;

enum function_mode_e { /* ... */ );

// for the LAST_ENTRY value in function_mode_e
static const int LAST_ENTRY = /* whatever */;

Как видите, вы переопределяете LAST_ENTRY, отсюда и ошибка. Лучше добавлять префиксы в перечисление к чему-либо, чтобы различать их:

enum options_e
{
    options_e_acm = 0,
    options_e_anm,
    options_e_smd,
    options_e_LAST_ENTRY,
    options_e_ENTRY_COUNT = options_e_LAST_ENTRY // note this is redundant 
};

enum function_mode_e
{
    function_mode_e_play = 0,
    function_mode_e_record,
    function_mode_e_bridge,
    function_mode_e_LAST_ENTRY,

    function_mode_e_ENTRY_COUNT = function_mode_e_LAST_ENTRY
};

Хотя теперь вы теряете то, что вы собирались раньше. (Не могли бы вы уточнить, что это было?)

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