【问题标题】:C enum tags: When/Why to UseC 枚举标签:何时/为什么使用
【发布时间】:2017-04-29 15:56:38
【问题描述】:

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

enum {
  IDLE,
  BUSY,
  FAILED
};

但我看到 C 枚举的正式定义也允许像下面这样的标记和实例名称:

enum STATE {
  IDLE,
  BUSY,
  FAILED
} appstate;

我何时以及为什么会使用 "STATE""appstate"?对于我的一生,我想不出一个理由。

问题84141887386805 在这个问题上拐弯抹角,但没有启发性。

2019 年 5 月 4 日更新
为了回答以下问题,我对我的问题做出了一些澄清:
1. 我确实使用前缀,例如STATE_IDLE,但这些在我上面的简单示例中被修剪了。 2. 我已经检查了几个使用枚举的代码示例。这些证实了我对增强语法的理解,但没有解释为什么
3. 我经常将我的匿名枚举放在项目范围的 .h 文件中,这似乎工作得很好。我仍然无法弄清楚为什么我想浪费击键来使用政治正确的增强语法。 只是为了(据称)提高可读性?还是我遗漏了什么?

【问题讨论】:

  • 使用标签然后使用该类型变量的假定优点是调试器通常能够为您提供该类型变量值的良好符号表示。
  • 您不太可能想要声明枚举类型的变量或函数参数。当您使用错误的枚举标识符时,还可以帮助体面的编译器生成诊断。

标签: c enums


【解决方案1】:

您想编码(这实际上很常见,例如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...),因为在许多有用的情况下(例如@987654346)编译器可能会警告您(显式enums) @关于那个enum缺少一些case....)。

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

【讨论】:

    【解决方案2】:

    关于国家

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

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

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

    关于应用状态

    它是一个enum STATE类型的变量。

    【讨论】:

      猜你喜欢
      • 2011-11-15
      • 1970-01-01
      • 2011-03-22
      • 1970-01-01
      • 2018-10-25
      • 2022-09-24
      • 2020-04-05
      • 2014-09-24
      • 2015-12-10
      相关资源
      最近更新 更多