Как определить перечислимый тип (enum) в C? - PullRequest
259 голосов
/ 09 июля 2009

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

enum {RANDOM, IMMEDIATE, SEARCH} strategy;
strategy = IMMEDIATE;

Но это не компилируется со следующей ошибкой:

error: conflicting types for ‘strategy’
error: previous declaration of ‘strategy’ was here

Что я делаю не так?

Ответы [ 12 ]

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

Тарк - лучший ответ.

Большая часть обсуждения перечисления - красная сельдь.

Сравнить этот фрагмент кода: -

int strategy;
strategy = 1;   
void some_function(void) 
{
}

, что дает

error C2501: 'strategy' : missing storage-class or type specifiers
error C2086: 'strategy' : redefinition

с этим, который компилируется без проблем.

int strategy;
void some_function(void) 
{
    strategy = 1;   
}

Переменная strategy должна быть установлена ​​при объявлении или внутри функции и т. Д. Вы не можете писать произвольное программное обеспечение - в частности, назначения - в глобальной области видимости.

Тот факт, что он использовал enum {RANDOM, IMMEDIATE, SEARCH} вместо int, имеет отношение только к той степени, в которой он запутал людей, которые не могут видеть за его пределами. Сообщения об ошибках переопределения в вопросе показывают, что автор поступил неправильно.

Так что теперь вы должны понять, почему первый из приведенных ниже примеров неправильный, а остальные три в порядке.

Пример 1. НЕПРАВИЛЬНО!

enum {RANDOM, IMMEDIATE, SEARCH} strategy;
strategy = IMMEDIATE;
void some_function(void) 
{
}

Пример 2. ПРАВО.

enum {RANDOM, IMMEDIATE, SEARCH} strategy = IMMEDIATE;
void some_function(void) 
{
}

Пример 3. ПРАВО.

enum {RANDOM, IMMEDIATE, SEARCH} strategy;
void some_function(void) 
{
    strategy = IMMEDIATE;
}

Пример 4. ПРАВО.

void some_function(void) 
{
    enum {RANDOM, IMMEDIATE, SEARCH} strategy;
    strategy = IMMEDIATE;
}

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

0 голосов
/ 08 марта 2017

Я попытался с gcc и придумал для себя, я был вынужден использовать последнюю альтернативу, чтобы скомпилировать без ошибок.

typedef enum state {a = 0, b = 1, c = 2} state ;

typedef enum state {a = 0, b = 1, c = 2} state;

typedef enum state old; // New type, alias of the state type.
typedef enum state new; // New type, alias of the state type.

new now     = a;
old before  = b;

printf("State   now = %d \n", now);
printf("Sate before = %d \n\n", before);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...