尽管有大量的选票和高度赞成的答案,但您引用的问题是基于一个完全错误的前提。它断言这段代码在 C 语言中是错误的:
enum {RANDOM, IMMEDIATE, SEARCH} strategy;
strategy = IMMEDIATE;
然而,事实上,该代码在 C89、C99 和 C2011 中完全没问题。它将变量strategy 声明为具有给定枚举常量的匿名枚举类型,并将该变量初始化为为其类型定义的三个值之一。该问题的 OP 报告的错误消息可能是由不符合要求的编译器发出的,或者故事可能比 OP 提供的更多。
另一方面,这种形式的变量声明的实际用途相对较小,因为没有其他对象可以声明为与此处声明的变量具有相同类型。声明枚举的类型有两种选择,以便可以在多个声明中使用:
- 用标签声明类型:
enum strategy_tag {RANDOM, IMMEDIATE, SEARCH} /* ... */ ;
- 使用
typedef 命名类型:typedef enum {RANDOM, IMMEDIATE, SEARCH} strategy_type;
然后您如何引用类型取决于您使用的形式。如果将类型声明为标记枚举,则可以通过引用标记在声明中使用它:
enum strategy_tag my_strategy = RANDOM;
。如果您将类型声明为 typedef'd 名称,则使用定义的名称作为类型名称
strategy_type my_strategy = IMMEDIATE;
。这些不是排他性的;您可以在单独的语句中标记enum 并为其声明typedef ...
enum strategy_tag {RANDOM, IMMEDIATE, SEARCH};
typedef enum strategy_tag strategy_type;
...甚至合二为一...
typedef enum strategy_tag {RANDOM, IMMEDIATE, SEARCH} strategy_type;
。如果您同时使用两种形式的类型声明,那么您可以在变量声明中使用一种或两种形式的类型说明符。
此外,请注意枚举标签、类型名称和变量名称的命名空间都是独立的,因此虽然可能会有些混乱,但您可以这样做:
typedef enum strategy {RANDOM, IMMEDIATE, SEARCH} strategy;
strategy strategy = RANDOM;
enum strategy strategy2 = strategy;
至于哪种方式最好,答案还不是很清楚。如果您有一套既定的编码约定来解决这个问题,那么当然最好遵循这些约定。如果不是,那么您可以选择,但要保持一致,至少在任何给定项目中是这样。我倾向于认为typedefs 通常被过度使用,但使用 then 来命名enums 是我认为有意义的用途之一。但是,如果您这样做,那么我建议 not 为 typedef'd enums 声明标签 - 因为您追求一致性,因此明确提供 in 的机制em>一致性会适得其反。