Вы не можете использовать неполный тип. Вы можете только передавать указатели на него. Это потому, что пока тип не завершен, компилятор не знает, насколько он велик. 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
позже.