プロが教える店舗&オフィスのセキュリティ対策術

static enum state {
Start,
Collect,
Skip,
End
} state;

この記述の扱いについて教えて頂ければ幸いです。

A 回答 (3件)

C言語の仕様の下書きならここで見られますので、まずは仕様をみてみる事をおすすめします。


http://www.open-std.org/jtc1/sc22/wg14/

とりあえず、最近公開されたC言語の仕様であるC11の最新の下書き (ほとんどリリースと同じだと予想しますが) はこれですね。
http://www.open-std.org/jtc1/sc22/wg14/www/docs/ …
この6.7.2.2 Enumeration specifiersを読むと良いと思います。

| 2 The expression that defines the value of an enumeration constant shall be an integer
| constant expression that has a value representable as an int.

まず、enum定数はint型で表現できるものしか表現出来ません。

| 4 Each enumerated type shall be compatible with char, a signed integer type, or an
| unsigned integer type. The choice of type is implementation-defined, but shall be
| capable of representing the values of all the members of the enumeration.

そして、enum型はchar型、符号付きint型、符号なしint型と互換性があります。
どの型になるかはenum定数が全て入る大きさであれば実装依存です。

まあ、よほどメモリーが逼迫している環境で使うバイナリーを吐くコンパイラーでもない限りint型にするのでは?


> スタティック変数のstateを初期化するには、Start/Collect/Skip/Endでしかできないのかな?と。

見落としがあるかもしれませんが、ざっと仕様を見る限り、そういう制限は特に見つけられませんでした。
ただ、ビット数が不足してしまい、メンバーではない値を代入した場合に正しく扱える保証はない可能性があるでしょう。

> enumを型宣言として扱い、enum内で定義される数によって、スタティック変数のstateが、char/int/longとして展開されるのかなと。

実装依存ですが、仕様を見る限りではenum定数を表せる最小限の型となるべくchar / int / unsigned intを使い分けることはありえるでしょう。
ただ、long型との互換性は無さそうです。
    • good
    • 0
この回答へのお礼

早々教えていあただいたページチェックしたいと思います。改めて新しくわかた事がありましたら、ご報告させていただきます。御回答ありがとうございました。

お礼日時:2013/04/27 17:30

C言語の仕様で、static変数は暗黙のうちにゼロに初期化されます。

この場合、変数stateの初期値はStartです。

名前空間が違うので問題ないですが、変数名が state で、型名(enumのタグ名)も同じ state というのは、あまり良くない名前の付け方ですね。
    • good
    • 0
この回答へのお礼

変数stateの初期値はStartというのは、なるほどと言う思いです。ありがとうございます。

お礼日時:2013/04/27 17:28

enum型の定数は特に指定がない限り先頭を基準として0から始まる整数値の定数が割り当てられます(増加値は1)。


なので、Startは0、Collectは1(以下略)のような意味になります。
標準出力に出力してみるとどうなっているかが分かりやすいかと思います。

この回答への補足

早々の御回答ありがとうございます。

アップしてから自分なり考えていたのですが、使われ方としたら、下記のような宣言したのと同じような扱いなのです。で、思ったのが、スタティック変数のstateを初期化するには、Start/Collect/Skip/Endでしかできないのかな?と。それで#define OTHERS 100;として、state=OTHERとなるか調べてみたのですが、OKのようでした。
enum state {
Start,
Collect,
Skip,
End
} state;

static int state;
で、思ったのですが、enumを型宣言として扱い、enum内で定義される数によって、スタティック変数のstateが、char/int/longとして展開されるのかなと。2日ほど前から悩んでいまして、本質問をアップして後、再度熟考してみたら、上のような事が閃いた次第です。

補足日時:2013/04/26 21:59
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!