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

时间:2017-04-29 15:56:38

标签: c enums

我试图理解C enum的完整语法。几十年来,我成功地使用了如下的简单枚举:

enum {
  IDLE,
  BUSY,
  FAILED
};

但是我看到C enum的正式定义也允许标签和实例名称如下所示:

enum STATE {
  IDLE,
  BUSY,
  FAILED
} appstate;

我何时以及为何使用" STATE" " appstate" ?对于我的生活,我无法想到一个理由。

问题84141887386805在这个问题上屡战屡败,但没有启发。

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

2 个答案:

答案 0 :(得分:9)

您想要编码(这实际上非常常见,例如Linux kernel's kernel/audit.h中的enum audit_state

enum STATE {
  IDLE,
  BUSY,
  FAILED
};

这样的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

或在typedef中:

typedef enum STATE stateT;

等...

您的appstate只是enum STATE类型的变量(就像我的global_state一样)。

我建议研究C中某些现有 free software的源代码(它不必像Linux内核那样复杂;你可以在github上找到很多例子。

请勿忘记在编译时启用所有警告(例如gcc -Wall -Wextra -gGCC ...),因为编译器可能会警告您(使用显式enum s)许多有用的案例(例如switch enum遗漏了一些case ....)。

BTW,C编程实际上需要很多约定,你可能会明确它们(例如在一些编码风格指南中)。

答案 1 :(得分:1)

关于STATE

通常,在创建枚举时,您希望将其用作类型。

当您不使用任何名称时,它只是一种声明整数常量的方法。

此外,使用匿名枚举,您不需要指定枚举名称来引用其成员,但可能会导致名称冲突。

关于appstate

它是enum STATE类型的变量。