2012-03-27 7 views
7

をENUM:C++のtypedef列挙するだけの違いである正確に何

typedef enum { 
    something1, 
    something2, 
    ..... 
    somethingN 
} myEnum; 

終了したばかり

enum myEnum{ 
    something1, 
    something2, 
    ..... 
    somethingN 
}; 

私はちょうどそのアプローチを疑問に思う、最初のケースでは、私はもちろん、無名の列挙型をtypedefedしている知っていますなぜですか?

+0

C++ 11では、どちらも使用しないでください: 'enum class'はより安全です。 – leftaroundabout

+1

@leftaroundabout確かに改善されていますが、 'enum class'は完全な置き換えとはかけ離れています。 2つのことがあります(必須のスコープと暗黙的な変換はありません)が、時には1つしか必要ない場合もあります。 –

+0

@leftaroundabout:これは元の質問には答えません。他の場所にリダイレクトするだけです。 – SasQ

答えて

15

最初の亜種はC言語で役に立ちました。そうでないと、あなたが使用したいと思ったどこでもenum myEnumと書く必要があったからです。

これはC++では当てはまりません。だから、AFAIKは、C++の最初のケースには何のメリットもありません(例えば、Cと共有する必要のあるインターフェースを定義している場合を除いて)。

12

違いはありません。実際、最初のバージョンはCスタイルのコーディングです。

C++ 11あなたのように定義しstronly-typed enum、導入しました:C++ 03では

enum class myEnum //note the 'class' keyword after the 'enum' keyword 
{ 
    something1, 
    something2, 
    ..... 
    somethingN 
}; 

を、列挙型は、タイプセーフをされていない、彼らは基本的に整数だし、他の整数型と混在させることができます暗黙のうちに、別の問題は、スコープがないことです。型を修飾することなくメンバーを使用できます。 something1を使用できます。一方、C++ 11の厳密に型指定されたenumはタイプセーフであり、スコープもあります。 myEnum::something1を使用する必要があります。

+1

C++ 03でお勧めするほど悪くはありません。列挙型は別個の型を定義し、それらをオーバーロードすることができ、それらを使用してオーバーロードされた演算子を定義できます。整数型への暗黙的な変換はちょっと面倒ですが、実際には問題ではありませんでした。 –

+0

@JamesKanze:申し訳ありませんが、C++ 03列挙型の大きな問題を追加しました。また、もしそれらが悪くないなら、C++ 11は強く型付けされた列挙型を追加しなかったであろう。 – Nawaz

+1

スコープは決して問題ではありませんでした。 'ネームスペースscope_for_my_enum {enum {foo、bar}; } '、または' class scope_for_my_enum {enum {foo、bar}; };クライアントがそれを不要にするかどうかによって、実際、これは古いenum *がスコープの点でより柔軟であることを意味します。 –

1

私は最初のものを使用しません。 ほとんどと同じです。 C++ 11では、2番目のコードではmyEnum::something1と書くことができますが、最初のコードではできません。 C++ 11では、enumを宣言することもできますが、unamed型の宣言を先に行うことは不可能であり、typedefを宣言することもできません。

関連する問題