Кажется, в заявлении есть путаница.
Когда strategy
предшествует {RANDOM, IMMEDIATE, SEARCH}
, как показано ниже,
enum strategy {RANDOM, IMMEDIATE, SEARCH};
вы создаете новый тип с именем enum strategy
. Однако при объявлении переменной вам необходимо использовать enum strategy
. Вы не можете просто использовать strategy
. Таким образом, следующее неверно.
enum strategy {RANDOM, IMMEDIATE, SEARCH};
strategy a;
Пока действует следующее
enum strategy {RANDOM, IMMEDIATE, SEARCH};
enum strategy queen = RANDOM;
enum strategy king = SEARCH;
enum strategy pawn[100];
Когда strategy
следует после {RANDOM, IMMEDIATE, SEARCH}
, вы создаете анонимное перечисление, а затем объявляете strategy
переменной этого типа.
Итак, теперь вы можете сделать что-то вроде
enum {RANDOM, IMMEDIATE, SEARCH} strategy;
strategy = RANDOM;
Однако вы не можете объявить любую другую переменную типа enum {RANDOM, IMMEDIATE, SEARCH}
, потому что вы никогда не называли ее. Таким образом, следующее неверно
enum {RANDOM, IMMEDIATE, SEARCH} strategy;
enum strategy a = RANDOM;
Вы можете объединить оба определения
enum strategy {RANDOM, IMMEDIATE, SEARCH} a, b;
a = RANDOM;
b = SEARCH;
enum strategy c = IMMEDIATE;
Typedef
, как отмечалось ранее, используется для создания более короткого объявления переменной.
typedef enum {RANDOM, IMMEDIATE, SEARCH} strategy;
Теперь вы сказали компилятору, что enum {RANDOM, IMMEDIATE, SEARCH}
является синонимом strategy
. Так что теперь вы можете свободно использовать strategy
в качестве типа переменной. Вам больше не нужно вводить enum strategy
. Следующее действует сейчас
strategy x = RANDOM;
Вы также можете объединить Typedef с именем enum, чтобы получить
typedef enum strategyName {RANDOM, IMMEDIATE, SEARCH} strategy;
Использование этого метода не дает большого преимущества, кроме того факта, что теперь вы можете использовать strategy
и enum strategyName
взаимозаменяемо.
typedef enum strategyName {RANDOM, IMMEDIATE, SEARCH} strategy;
enum strategyName a = RANDOM;
strategy b = SEARCH;