10

いくつかの.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...

列挙型が宣言されているヘッダー全体を含めずに、どのようにこれを行うのでしょうか?

4

2 に答える 2

10

不完全なタイプは使用できません。ポインタを渡すことしかできません。これは、型が完成するまで、コンパイラーはそれがどれだけ大きいかを知らないためです。OTOHポインターは、ポイントしているタイプに関係なく、データポインターのサイズです。不完全な型で実行できないことの1つは、その型の変数を宣言することです。

extern変数宣言では、コンパイラーは、ストレージを割り当てる代わりに、別のコンパイル単位(リンカーによって解決される)で提供される識別子への参照を発行することを意味します。 externC ++文法で型名の横に表示されている場合でも、型は変更されません。


あなたができることは、列挙型メンバーが整数定数値であるという事実を利用して、プリミティブな整数型にうまく変換することです。

だからあなたはこれを行うことができます:

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これはtypedefであり、後でキーワードで修飾することはできません。

于 2011-03-07T19:38:14.180 に答える
4

列挙値が表示されていない場合、それらを使用することはできません。ヘッダーが大きすぎて含めることができない場合は、列挙型を独自のヘッダーに入れて、それだけを含めてはどうでしょうか。

于 2011-03-07T19:38:14.587 に答える