FAQ

QA・C/QA・C++

QA・C++ 特有のFAQ

ID.

Q. const enum { ... };という形式の構文は解析できないのでしょうか? QA・C++ の全バージョン

A.


ISO C++違反の構文であるため解析することができません。理由は次の通りです。

クラス型、構造体型、共用体型、列挙体型は次の3種類の形式で定義することができます。1. タグのみを定義する形式 enum ENUM_TAG { enumerator1, enumerator2 };2. タグとオブジェクトを同時に定義する形式 enum ENUM_TAG { enumerator1, enumerator2 } enum_object;なお、2番目の形式は次と同等です。 enum ENUM_TAG { enumerator1, enumerator2 }; ENUM_TAG enum_object;3. タグとtypedef識別子を同時に定義する形式 typedef enum ENUM_TAG { enumerator1, enumerator2 } TYPEDEF_ENUM;なお、3番目の形式は次と同等です。 enum ENUM_TAG { enumerator1, enumerator2 }; typedef ENUM_TAG TYPEDEF_ENUM;1番目の形式は、タグを定義しているだけでオブジェクトやtypedef識別子を定義しているわけでは ありません。このため、ISO C++に準拠しているコンパイラでは、クラス型、 構造体型、共用体型、列挙型を表すそれぞれの キーワード class、struct、union、enum の前にオブジェクトを修飾するための キーワードを記述することはできません。
しかし、ISO C++に準拠していないコンパイラは、1番目の形式と1番目以外の形式を 適切に区別しないので次のような構文を記述できてしまいます。ISO C++違反の構文例1: const enum ENUM_TAG { enumerator1, enumerator2 };ISO C++違反の構文例2: virtual enum ENUM_TAG { enumerator1, enumerator2 };ISO C++違反の構文例3: static enum ENUM_TAG { enumerator1, enumerator2 };QA C++はISO C++に従ってこれらの構文をエラーとして扱います(該当箇所には14番の警告が出力されます)。
ISO C++に準拠していないコンパイラであっても1番目の形式では、キーワード class、struct、union、enum の前にオブジェクトを修飾するためのキーワードを記述した場合としなかった場合とで文法的な意味は変わらないはずなので、恐れ入りますが、ソースコード側を修正して解析できるようにしてください。

<< QA・C++ 特有のFAQに関するFAQ一覧へ戻る