我试图理解C enum的完整语法.几十年来,我成功地使用了如下的简单枚举:
enum {
IDLE,
BUSY,
FAILED
};
Run Code Online (Sandbox Code Playgroud)
但是我看到C enum的正式定义还允许标签和实例名称如下所示:
enum STATE {
IDLE,
BUSY,
FAILED
} appstate;
Run Code Online (Sandbox Code Playgroud)
何时以及为什么我会使用"STATE"或"appstate"?对于我的生活,我想不出一个理由.
问题8414188和7386805在这个问题上击败了丛林,但没有启发.
更新5/4/19
我对我的问题提出了一些澄清,以回应下面的答案:
1.我确实使用了前缀,例如STATE_IDLE,但是这些在我上面的例子中被修剪了.2.我已经研究使用枚举几个代码示例.这些证实了我对增强语法的理解,但没有解释原因.
我经常将我的匿名枚举放在项目范围的.h文件中,这似乎工作正常.我仍然无法弄清楚为什么我想浪费击键来使用政治上正确的增强语法.是否仅仅(据称)提高了可读性?或者我错过了什么?
你想编码(这实际上很常见,例如enum audit_state
在Linux内核中kernel/audit.h
)
enum STATE {
IDLE,
BUSY,
FAILED
};
Run Code Online (Sandbox Code Playgroud)
这样的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
Run Code Online (Sandbox Code Playgroud)
或者在typedef中:
typedef enum STATE stateT;
Run Code Online (Sandbox Code Playgroud)
等等....
你appstate
只是一个类型的变量enum STATE
(就像我global_state
的一样).
我建议在C中研究一些现有免费软件的源代码(它不必像Linux内核那样复杂;你可以在github上找到很多例子).
不要忘记在编译时启用所有警告(例如gcc -Wall -Wextra -g
使用GCC ...),因为编译器可能会enum
在许多有用的情况下警告您(使用显式s)(例如switch
,enum
错过了一些case
....).
BTW,C编程实际上需要很多约定,你可能会明确它们(例如在一些编码风格指南中).