- 締切済み
typedef enumの使い方を教えてください
enumもtypedefも知っていますが下記コードのような typedef enumを使用したものがどういった場面で有効なのかを簡単な具体例を使って教えてください。 enum { E1, E2 } E; typedef enum { e1, e2 } e; 特に前者と後者を使いを分ける状況の違いについて教えてください。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- gachinco
- ベストアンサー率20% (32/156)
1)enum{E1,E2}E; タグ名は省略したenum(列挙)型を定義する。enum{E1,E2}型の変数Eを宣言する。 1)ではenum{E1,E2}型の変数Eを宣言してる。 2)typedef enum{e1,e2}e; タグ名は省略したenum(列挙)型を定義する。enum{e1,e2}型を新しい型e型と定義する。 2)ではenum{e1,e2}型をeという新しい型で定義をしてる。変数の宣言は行われない。 1)の場合、関数の中で新しく変数宣言する場合 #include<stdio.h> enum{E1,E2} E; int main() { int …; double …; enum{E1,E2} a1;//enum{E1,E2}型の変数a1を新たに宣言 …; return 0; } 2)の場合 #include<stdio.h> typedef enum{e1,e2}e; int main() { int …; double …; e a1;//e型の変数a1を新たに宣言 …; return 0; } 2)の方がコーディング量が減って楽。 もし2)でtypedefしないと、 e a1; の部分を enum{e1,e2} a1; と書かなければならない。 だから、関数の引数として用いたり、関数の中で新しく変数を宣言する場合は、長ったらしい列挙型の部分を、typedefを用いて新しい短い型名として定義しておいた方が楽じゃんって事 とゆー事で良いですか? 回答が的を得てるのかいまいち自信がないですけど
- nyan5504
- ベストアンサー率42% (6/14)
前者は無名enum型変数宣言であり、後者は別名型定義です。使い分けるというものではなくて、そもそも効果が違います。 enumについては5種類の書き方があり、 1) enum E { e1, e2 }; 2) enum E { e1, e2 } v; 3) enum { e1, e2 } v; 4) typedef enum E { e1, e2 } Ea; 5) typedef enum { e1, e2 } Ea; というものです。 (1)は標準的な"型定義のみの"記法です。 (2)は(1)の効果に加えて、変数宣言も同時に行うものです。このときvの型はEです。 (3)は変数宣言を行う記法です。このときはvの型は"無名"になり、プログラム中でvの型を記述することはできません。 (4)は型定義と型の別名宣言を同時に行う書式です。Eの別名Eaを宣言しています。これはenum Eと書かずにE2に書けるようにするためで、単に記述がしやすくなることを狙ったものです。 (5)は(4)から型の名前を除いたものです。enumのオリジナルの型は無名になってしまいますが、(3)と違い、E2として型名を参照できるので、プログラム中で無名型をE2として再利用することが出来ます。
- Tacosan
- ベストアンサー率23% (3656/15482)
ふつうに考えると Egame と Emusic は「別の型」だと思います。可読性が悪くなったのは、本来別の型である Egame や Emusic を同じ型にしてしまったのが原因。 だから、 typedef enum { n64, pstation } Egame; typedef enum { jazz, rock } Emusic; のように Egame や Emusic を定義して Egame game = n64; Emusic music = jazz; と使うものでしょう。
- shige_70
- ベストアンサー率17% (168/946)
struct と typedef struct の違いとにています。 すなわち、同じenumの型をもつ変数を複数定義するとき、あらかじめtypedefしておけば簡潔に書ける、ということです。 つまりプログラムの記述のしやすさに影響するのみで、生成されるコードに違いはありません。
補足
ありがとうございます。typedef structで思い出しました。 enum { n64, pstation } Egame; Egame = n64; enum { jazz, rock } Emusic; Emusic = jazz; … if (Emusic == jass) {… 上記のような2つのenumの定義を下記のコードのようにするとスッキリするというものでしょうか? 下記のコードはスッキリしましたが、例えば if (Emusic == E2) {… の可読性については上記コードに劣るものになってしまいました。 もっとよい例がございましたら教えてください。 下記のコードの可読性の弱点を克服できる考えもございましたら教えてください。 typedef enum { E1, E2 } Entertainment; Entertainment Egame, Emusic; Egame = E1; Emusic = E2; … if (Emusic == E2) {…