extern enum в c ++ - PullRequest
       38

extern enum в c ++

8 голосов
/ 07 марта 2011

У меня есть перечисление, которое я объявил в каком-то файле .h:

typedef enum {
    NONE,
    ONE,
    TWO,
    THREE
} MYENUM;

в отдельном .cpp Я не могу сделать это:

extern enum MYENUM; //works
extern MYENUM TWO; //makes sence, TWO is not an INSTANCE of MYENUM...

как бы это сделать безвключая весь заголовок, в котором объявлен enum?

Ответы [ 2 ]

10 голосов
/ 07 марта 2011

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

extern в объявлении переменной означает, что компилятор будет выдавать ссылку на идентификатор, предоставленный в другом модуле компиляции (который должен быть разрешен компоновщиком), вместо выделения памяти. extern не изменяет тип, даже если он отображается рядом с именем типа в грамматике C ++.


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

Так что вы можете сделать это:

a.cpp

enum MYENUM { ONE=1, TWO, THREE };
int var = TWO;

B.cpp

extern int var;

Но типы должны совпадать. Вы не могли бы сказать MYENUM var = TWO;, а также extern int var;. Это нарушит правило одного определения (нарушение может или не может быть обнаружено компоновщиком).


Кстати, это неверно:

typedef enum {
    NONE,
    ONE,
    TWO,
    THREE
} MYENUM;
enum MYENUM TWO;

MYENUM НЕ является идентификатором перечисления. Это определение типа и не может быть уточнено с ключевым словом enum позже.

3 голосов
/ 07 марта 2011

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

...