2011-03-07 23 views
8

Ben bazı .h dosyasında bildirilen gelmiş bir enum:extern enum

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

ayrı .cpp ben bunu yapamam: biri çok etmeden yapacağını nasıl

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

enum'un bildirildiği tüm başlık dahil olmak üzere?

+2

Enum üyelerini kullanmak için derleme biriminden görünebilir olmalıdırlar. Bu, başlık dosyalarını eklemeniz gerektiği anlamına gelir. –

+0

O, AFAICS üyelerini kullanmaya çalışmıyor. –

cevap

10

Tamamlanmamış bir tür kullanamazsınız. Sadece işaretçilerden geçebilirsiniz. Bunun nedeni, tür tamamlanana kadar derleyicinin ne kadar büyük olduğunu bilmemesidir. OTOH bir işaretçi, hangi tipte olduğuna bakılmaksızın bir veri işaretçisinin boyutudur. Tamamlanmamış bir türle yapamayacağınız şeylerden biri, bu türden değişkenleri bildirmektir. Bir değişken bildiriminde extern, derleyicinin, başka bir derleme biriminde (bağlayıcı tarafından çözülecek) bir tanımlayıcıya bir başvuru yayınlayacağı anlamına gelir. extern, C++ dilbilgisinde yazım adının yanında görünse bile türü değiştirmez.


Ne yapabilirsiniz enum üyeleri ayrılmaz sabit değerlerdir gerçeği yararlanmak ve ilkel tamsayı türlere gayet dönüştürmek olduğunu.

A.cpp

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

B.cpp

extern int var; 

Ama türleri eşleşmelidir:

Yani bunu yapabilirsiniz. MYENUM var = TWO; ve ayrıca extern int var; diyemezsiniz. Bu, tek tanım kuralını ihlal eder (ihlal, bağlayıcı tarafından algılanabilir veya algılanmayabilir).


bir kenara, bu yanlıştır:

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

MYENUM bir enum tanımlayıcı DEĞİLDİR. Bu bir yazım hatasıdır ve daha sonra enum anahtar kelimesiyle nitelendirilemez.

2

Görünür olmadığında enum değerlerini kullanamazsınız. Başlık içermek için çok büyükse, neden enumu kendi başlığına koymaz ve yalnızca bu içeriği dahil etmesin?