これは他の場所で回答された可能性がありますが、適切な応答が見つかりませんでした。
私はこのコードを持っています:
enum enumWizardPage
{
WP_NONE = 0x00,
WP_CMDID = 0x01,
WP_LEAGUES = 0x02,
WP_TEAMS = 0x04,
WP_COMP = 0x08,
WP_DIVISIONS = 0x10,
WP_FORMULAS = 0x20,
WP_FINISHED = 0x40,
};
これはレガシーであり、いくつかの新しい値を追加して変更する必要があります。問題は、各値が一意のビットである必要があるため、ビットマップに結合されるORの場合があります。
値は#x ## 16進形式を使用して設定されますが、これが格納できる最大値であるかどうか疑問に思っていますか?コードを次のように変更した場合、どのような影響がありますか?
enum enumWizardPage
{
WP_NONE = 0x0000,
WP_CMDID = 0x0001,
WP_LEAGUES = 0x0002,
WP_TEAMS = 0x0004,
WP_COMP = 0x0008,
WP_DIVISIONS = 0x0010,
WP_FORMULAS = 0x0020,
WP_FINISHED = 0x0040,
};
から N4659 C++ 7.2/5 :
基になる型が固定されていない列挙型の場合、基になる型は、列挙型で定義されているすべての列挙子の値を表すことができる整数型です。すべての列挙子の値を表すことができる整数型がない場合、列挙型の形式が正しくありません。列挙型の値が
int
またはunsigned int
に収まらない場合を除いて、基になる型がint
を超えないことを除いて、基になる型として使用される整数型は実装定義です。 enumerator-listが空の場合、基になる型は、列挙に値0の単一の列挙子があるかのようになります。
C++ enumの型はenum自体です。その範囲はかなり恣意的ですが、実際には、その基礎となる型はint
です。
ただし、使用される場所にかかわらず、暗黙的にint
にキャストされます。
これは、型付き列挙型を導入したC++ 11から変更されました。型指定されていないenum
は、少なくともint
の幅(より大きな値が必要な場合はより広い)として定義されるようになりました。ただし、次のように定義された型付きenum
が与えられたとします。
enum name : type {};
タイプname
の列挙には、基礎となるタイプtype
があります。たとえば、enum : char
は、enum
ではなくchar
と同じ幅のint
を定義します。
さらに、enum
は次のようにスコープを明示的に指定できます。
enum class name : type {
value = 0,
// ...
};
(ここでname
は必須ですが、type
はオプションです。)この方法で宣言されたenum
は、暗黙的にその基本型にキャストされません(static_cast<>
が必要)。値は完全修飾名で参照する必要があります。この例では、value
をenum
変数に割り当てるには、その変数をname::value
として参照する必要があります。
IIRCは、メモリ内ではintとして表されます。しかし、gccにはスイッチ-fshort-enum
スペースを節約する必要がある場合、すべての値に適合する最短の整数型にします。他のコンパイラも同様のものを持っています。