2011-03-07 18 views
8

I持って、私はいくつかの.hファイルで宣言した列挙型:のextern列挙

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

別々の.cppファイルで、私はこれを行うことはできません。一つはそうせずにどうなるか

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

列挙型が宣言されているヘッダ全体を含む?

+2

列挙型メンバを使用するには、コンパイル単位から見える必要があります。つまり、ヘッダファイルをインクルードする必要があります。 –

+0

彼はメンバー、AFAICSを使用しようとしていません。 –

答えて

10

不完全なタイプは使用できません。ポインタを渡すことしかできません。これは、型が完了するまで、コンパイラはその大きさを知らないからです。 OTOHは、ポインターの種類に関係なく、データポインターのサイズです。不完全な型ではできないことの1つは、その型の変数を宣言することです。

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;とは言えませんでした。これは、1つの定義ルール(違反がリンカによって検出されるかどうかに関係なく)に違反します。余談として


、これは正しくありません。

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

MYENUMは、列挙型識別子ではありません。これはtypedefであり、後でenumキーワードで修飾することはできません。

2

列挙型の値が表示されていない場合は使用できません。ヘッダーがインクルードするには大きすぎる場合は、列挙型を独自のヘッダーに入れて、それをインクルードするだけではいかがですか?