C enum标签:何时/为何使用

Don*_*nic 6 c enums

我试图理解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"?对于我的生活,我想不出一个理由.

问题84141887386805在这个问题上击败了丛林,但没有启发.

更新5/4/19
我对我的问题提出了一些澄清,以回应下面的答案:
1.我确实使用了前缀,例如STATE_IDLE,但是这些在我上面的例子中被修剪了.2.我已经研究使用枚举几个代码示例.这些证实了我对增强语法的理解,但没有解释原因.
我经常将我的匿名枚举放在项目范围的.h文件中,这似乎工作正常.我仍然无法弄清楚为什么我想浪费击键来使用政治上正确的增强语法.是否仅仅(据称)提高了可读性?或者我错过了什么?

Bas*_*tch 9

你想编码(这实际上很常见,例如enum audit_stateLinux内核中kernel/audit.h)

enum STATE {
  IDLE,
  BUSY,
  FAILED
};
Run Code Online (Sandbox Code Playgroud)

这样的enum定义很可能(按照惯例)进入某个公共头文件.您可以采用约定来共享各种枚举值的公共前缀,所以写STA_IDLESTA_BUSY代替IDLEBUSY; 有时我采用后缀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编程实际上需要很多约定,你可能会明确它们(例如在一些编码风格指南中).