Cで列挙型(enum)を定義するには?

不要であることに注意してください。 typedef .次のようにできます

enum strategy { RANDOM, IMMEDIATE, SEARCH };
enum strategy my_strategy = IMMEDIATE;

typedef を好むかどうかはスタイルの問題です .それがなく、列挙型を参照したい場合は、 enum strategy を使用する必要があります .これで strategy と言えます .

どちらの方法にも長所と短所があります。 1 つはより冗長ですが、型識別子をタグ名前空間に保持し、通常の識別子と競合しないようにします (struct stat を考えてください)。 そして stat function:これらも競合しません)、そしてすぐにそれが型であることがわかります。もう 1 つは短いですが、型識別子を通常の名前空間に取り込みます。


enum 変数の宣言は次のように行います:

enum strategy {RANDOM, IMMEDIATE, SEARCH};
enum strategy my_strategy = IMMEDIATE;

ただし、 typedef を使用できます 次のように変数宣言を短縮します:

typedef enum {RANDOM, IMMEDIATE, SEARCH} strategy;
strategy my_strategy = IMMEDIATE;

型と変数を区別するための命名規則を持つことは良い考えです:

typedef enum {RANDOM, IMMEDIATE, SEARCH} strategy_type;
strategy_type my_strategy = IMMEDIATE;

strategy を宣言しようとしています 2 回、それが上記のエラーが発生する理由です。以下は問題なく動作します (gcc -ansi -pedantic -Wall でコンパイル) ):

#include <stdio.h>

enum { RANDOM, IMMEDIATE, SEARCH } strategy = IMMEDIATE;

int main(int argc, char** argv){
    printf("strategy: %d\n", strategy);

    return 0;
}

上記の代わりに、2 行目が次のように変更された場合:

...
enum { RANDOM, IMMEDIATE, SEARCH } strategy;
strategy = IMMEDIATE;
...

警告から、間違いを簡単に確認できます:

enums.c:5:1: warning: data definition has no type or storage class [enabled by default]
enums.c:5:1: warning: type defaults to ‘int’ in declaration of ‘strategy’ [-Wimplicit-int]
enums.c:5:1: error: conflicting types for ‘strategy’
enums.c:4:36: note: previous declaration of ‘strategy’ was here

したがって、コンパイラは strategy = IMMEDIATE かかりました strategy という変数の宣言 デフォルトのタイプ int で 、しかし、この名前の変数の以前の宣言が既にありました.

ただし、割り当てを main() に配置した場合 関数、それは有効なコードになります:

#include <stdio.h>

enum { RANDOM, IMMEDIATE, SEARCH } strategy = IMMEDIATE;

int main(int argc, char** argv){
    strategy=SEARCH;
    printf("strategy: %d\n", strategy);

    return 0;
}