16

c と c++ の両方enumで、タグで定義できます

enum e_smth {
    smth_one,
    smth_two,
    smth_err
};

またはタグなし

enum {
    smth_one,
    smth_two,
    smth_err
};

switchtag で定義されている場合、c と c++ の両方のステートメントで意味があります。

e_smth some_var;
....//do some stuff with some_var
switch (some_var)
{
case smth_one:
break;
case smth_two:
break;
}

-Wswitchこれが gcc または g++ でコンパイルされる場合、警告 が生成 されます。

これは、c++ での関数の宣言と変数の初期化で意味があります。

e_smth var;
var=99;

-fpermissiveg++ でコンパイルするとエラーが発生します。

タグの有無にかかわらず、両方のタイプをパラメーターなしの 1 つのファイル#defineマクロとして使用できます。


アップデート

パラメータなしで1つのファイル#defineマクロとして使用できます

意味:#define MAX 1000ファイルに書き込んでMAXをグローバルに追加する代わりにenum { MAX=1000 }、ファイルスコープでのみ使用します


typedef enum { a,b,c } some_t;匿名の列挙型についてはどうでしょうか。使用例が 1 つだけ見つかりました。

質問:

すべての合理的な使用例をまだ説明していない場合、匿名の列挙型には何を使用する必要がありますか?

4

4 に答える 4

19

C (ただし C++ では不可) では、定数enumを定義するために [ab] 使用できます。int

たとえば、次の宣言があるとします。

const int MAX = 1024;

MAXは定数式ではなく、読み取り専用オブジェクトの名前です。つまり、ファイル スコープまたは で宣言された配列のサイズとして、staticまたは定数式を必要とするその他のコンテキストでは、ケース ラベルでは使用できません。

しかし、次のように書くと:

enum { MAX = 1024 };

thenMAX type の定数式であり、定数をint使用できるあらゆるコンテキストで使用できます1024

もちろん、次のように書くこともできます。

#define MAX 1024

ただし、プリプロセッサを使用することには欠点があります。たとえば、識別子は、通常の宣言が与えられる方法とは異なります。

欠点は、そのような定数は 型しか持てないことですint

C++ にはさまざまな規則があります。列挙定数は ではなく列挙型intですが、宣言された定数オブジェクトを定数式として使用できます (初期化子が定数式である限り)。

元の質問に対処するには、enum宣言を使用してこのような定数を作成する場合、型自体を使用することはないため、タグまたは typedef を使用しても意味がありません。

背景: これ:

enum foo { zero, one, two };
enum foo obj = two;

enum fooと定数zeroone、およびを作成しtwoます。C では、定数は常に 型intであり、これは確かに奇妙であり、 の初期化には からへobjの暗黙的な変換が含まれます。intenum foo

C++ では、型enum fooは just と呼ばれることもfooあり、定数は型ですenum foo(これは整数型と互換性がありますが必ずしも ではありませんint)。

于 2012-04-14T20:54:00.453 に答える
5

struct別の使用例は、またはの要素としてのものですunion。通常、それを単独で使用する意味がない場合です (通信プロトコルなどの ABI を満たすためだけに存在し、プログラムで使用するためのより適切な表現があるため)。 )。

于 2012-04-14T20:42:41.080 に答える
0

@エイス・トンプソン

あなたの答えには、「const int MAX = 1024; MAX は定数式ではありません」という文があります。ただし、リンクhttp://en.cppreference.com/w/cpp/language/constant_expressionの例 は、それが定数式であり、配列宣言で使用できることを示しています。定数式 C++ C++ 言語 式 コンパイル時に評価できる式を定義します。

このような式は、非型テンプレート引数、配列サイズ、および定数式を必要とするその他のコンテキストで使用できます。

int n = 1;
std::array<int, n> a1; // error, n is not a constant expression
const int cn = 2;
std::array<int, cn> a2; // OK, cn is a constant expression
于 2016-07-28T17:56:37.120 に答える
0

通常、列挙型を複数回使用する場合にのみ、列挙型に名前を付ける必要があります。つまり、同じ列挙型を使用して複数の変数を定義する場合は、列挙型に名前を付ける必要があります。ただし、列挙型を 1 回だけ使用し、その列挙型を持つ変数が 1 つしかない場合は、匿名列挙型が理にかなっています。例えば:

enum color { red, blue, gray, green };
enum color car_color;
enum color house_color;

ここには複数の変数があるため、enum に名前が付けられます。

typedef struct {
    int year;
    enum { Jan, Feb, Mar, Apr, May, Jun, July, Aug, Sep, Oct, Nov, Dec } month;
    unsigned int day;
} date;

ここでは、作成者は enum を 1 回だけ使用する予定であるため、名前は不要です。

于 2019-04-11T20:10:32.980 に答える