C での列挙型の前方宣言 : 制限事項と回避策
C では、列挙型のサイズが依存するため、列挙型の前方宣言は以前は不可能でした。その内容。しかし、C 11 の導入により、列挙型のサイズを明示的に指定する限り前方宣言が可能になりました。
問題ステートメント:
元の問題が発生しました次の方法で列挙型を前方宣言しようとしたとき:
enum E; void Foo(E e); enum E {A, B, C};
このコードは、によって拒否されました。コンパイラ。
説明:
C 03 以前のバージョンでは、コンパイラは列挙型の前方宣言を行うために列挙型のサイズを知る必要があるため、列挙型の前方宣言は許可されませんでした。その値を保存します。列挙型のサイズは、列挙値の数と型によって異なります。この情報がないと、コンパイラは列挙型にメモリを割り当てることができません。
C 11 以降の解決策:
C 11 以降のバージョンでは、列挙型の前方宣言列挙型のサイズを明示的に指定することで可能になります。これは enum を使用して行うことができます:
例:
enum Enum : unsigned int; // Forward declaration with an underlying type void Foo(Enum e); // Definition of the enum in a separate source file enum Enum { VALUE1, VALUE2, VALUE3 };
このコードは正常にコンパイルされます。
プライベート列挙値に関する考慮事項:
前述の特定のシナリオでは、ここでenum 値は非公開にしておく必要がありますが、前方宣言アプローチは引き続き実行可能です。 enum は、クライアントに enum 値を公開せずに、ヘッダー ファイルでプライベートに宣言し、実装ファイルで内部的に定義できます。
ただし、前方宣言によって enum 内の enum 値へのアクセスが妨げられないことに注意することが重要です。同じ翻訳単位 (つまり、同じソース ファイルまたは一緒にコンパイルされたファイルのセット)。したがって、ヘッダー ファイルにアクセスできるプログラムの他の部分から列挙値にアクセスすることは可能です。
以上がC で列挙型を前方宣言できますか?またその方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。