我试图理解C enum的完整语法。几十年来,我成功地使用了如下的简单枚举:
enum {
IDLE,
BUSY,
FAILED
};
但是我看到C enum的正式定义也允许标签和实例名称如下所示:
enum STATE {
IDLE,
BUSY,
FAILED
} appstate;
我何时以及为何使用" STATE" 或" appstate" ?对于我的生活,我无法想到一个理由。
问题8414188和7386805在这个问题上屡战屡败,但没有启发。
更新5/4/19
我在回答下面的答案时对我的问题作了一些澄清:
1.我做使用前缀,例如STATE_IDLE,但是在我上面的简单示例中修剪了这些内容。
2.我已经使用枚举检查了几个代码示例。这些证实了我对增强语法的理解,但没有解释为什么
我经常将我的匿名枚举放在项目范围的.h文件中,这似乎工作正常。我仍然无法找出为什么我想浪费击键来使用政治上正确的增强语法。 是否只是(据称)提高了可读性?或者我错过了什么?
答案 0 :(得分:9)
您想要编码(这实际上非常常见,例如Linux kernel's kernel/audit.h
中的enum audit_state
)
enum STATE {
IDLE,
BUSY,
FAILED
};
这样的enum
定义很可能(按照惯例)进入某个公共头文件。您可以采用约定来共享各种枚举值的公共前缀,因此请写STA_IDLE
或STA_BUSY
而不是IDLE
和BUSY
;有时我采用后缀enum
标记的惯例,STATE
和_en
,所以我宁愿编码enum STATE_en { STA_IDLE, STA_BUSY,
... };
如果您想使用(特别是出于可读性目的)enum STATE
作为例如一些变量或正式:
enum STATE global_state; // a global variable
void print_state(enum STATE); // a formal
或在typedef中:
typedef enum STATE stateT;
等...
您的appstate
只是enum STATE
类型的变量(就像我的global_state
一样)。
我建议研究C中某些现有 free software的源代码(它不必像Linux内核那样复杂;你可以在github上找到很多例子。
请勿忘记在编译时启用所有警告(例如gcc -Wall -Wextra -g
与GCC ...),因为编译器可能会警告您(使用显式enum
s)许多有用的案例(例如switch
enum
遗漏了一些case
....)。
答案 1 :(得分:1)
关于STATE
通常,在创建枚举时,您希望将其用作类型。
当您不使用任何名称时,它只是一种声明整数常量的方法。
此外,使用匿名枚举,您不需要指定枚举名称来引用其成员,但可能会导致名称冲突。
关于appstate
它是enum STATE
类型的变量。