不要であることに注意してください。 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;
}