1. ホーム
  2. c++

[解決済み] C++でenumを前方に宣言する

2022-02-14 16:58:01

質問

以下のようなことをやろうとしています。

enum E;

void Foo(E e);

enum E {A, B, C};

というメッセージが表示され、コンパイラに拒否されます。 Googleで調べてみたところ、「できない」という意見が多いようですが、その理由がわかりません。 どなたか説明していただけませんか?

明確化 2: 私は、クラス内に当該列挙型を受け取るプライベート・メソッドがあり、列挙型の値を公開したくないので、この方法をとっています。

enum E {
    FUNCTIONALITY_NORMAL, FUNCTIONALITY_RESTRICTED, FUNCTIONALITY_FOR_PROJECT_X
}

プロジェクトXはユーザーに知られたくないものだからです。

そこで、enumをフォワード宣言して、ヘッダファイルにプライベート・メソッドを記述し、cppの内部でenumを宣言し、ビルドしたライブラリファイルとヘッダを人に配りたいと思いました。

コンパイラはGCCです。

解決方法は?

enum を前方宣言できない理由は、値を知らなければ、コンパイラが enum 変数に必要なストレージを知ることができないからです。 C++コンパイラは、指定されたすべての値を格納するのに必要なサイズに基づいて、実際の記憶領域を指定することが許されています。 もし、前方宣言しか見えないのであれば、翻訳ユニットはどのような記憶容量が選ばれたかを知ることができません。 char または int といった具合に。


ISO C++規格の7.2.5項より。

基礎型 は、列挙型で定義されたすべての列挙子値を表すことができる積分型である。どの積分型を列挙の基礎型として使用するかは実装定義である。 int ただし、列挙子の値が int または unsigned int . もし 列挙者リスト が空であれば、あたかも列挙型に値0を持つ列挙子が1つあるかのような型になります。の値は sizeof() を列挙型、列挙型のオブジェクト、あるいは列挙子に適用すると sizeof() を基本型に適用する。

となっているので 呼び出し側 関数へのパラメータは、コールスタックを正しくセットアップするために、その大きさを知っている必要があります。

更新してください。

C++0Xでは、enum型を前方に宣言するための構文が提案され、受け入れられています。 この提案は次のサイトで見ることができます。 列挙型の前方宣言(rev.3)