【问题标题】:Using enum members with enum name in C在 C 中使用具有枚举名称的枚举成员
【发布时间】:2017-08-25 07:55:24
【问题描述】:

我已经定义了以下枚举:

typedef enum {
    F105 = 0x00,
    F164 = 0x10,
    F193 = 0x20,
    F226 = 0x30,
    F227 = 0x40
}BOARD_TYPE;

为了使代码可读,我想在使用枚举成员之一时使用枚举名称。像这样:

void do_work(uint8_t board_type) {
    if (board_type == BOARD_TYPE.F164) {
        // Do stuff...
    }
}

现在,这不能编译。我收到一条错误消息“'BOARD_TYPE' 之前的预期表达式”。

那么,使用枚举成员同时引用枚举名称以提高代码可读性的正确方法是什么?

【问题讨论】:

  • 如果只是为了便于阅读,您可以在声明其值时包含枚举名称,例如 typedef enum { BOARD_TYPE_F105 = 0x00 } BOARD_TYPE
  • @LethalProgrammer 你肯定是说board_type = F164

标签: c enums


【解决方案1】:

enum 是一个值列表,一个“枚举”。它不是具有成员的结构/容器类。

现在您应该为清楚起见仅将给定类型的枚举常量与相同类型的变量进行比较。不像你的例子那样反对uint8_t

这几乎是自记录的代码:

void do_work (BOARD_TYPE board_type) {
    if (board_type == F164) {
        // Do stuff...
    }
}

可以将好的编译器配置为在将枚举与错误类型进行比较时发出警告。否则你也可以通过一些技巧创建type safe enums

您还可以为所有枚举常量添加前缀以表明它们属于什么类型 - 这是常见的做法:

typedef enum {
    BOARD_F105 = 0x00,
    BOARD_F164 = 0x10,
    BOARD_F193 = 0x20,
    BOARD_F226 = 0x30,
    BOARD_F227 = 0x40
}BOARD_TYPE;

【讨论】:

  • 啊,我喜欢。感谢您的输入。 :-)
【解决方案2】:

枚举不是一个结构,成员名称只是相应常量的名称,因此您无法通过.访问枚举元素

改变

BOARD_TYPE.F164

F164

枚举常量的类型为int,因此board_type 将扩展为int


为了更好的可读性

typedef enum {
    BOARD_F105 = 0x00,
    BOARD_F164 = 0x10,
    BOARD_F193 = 0x20,
    BOARD_F226 = 0x30,
    BOARD_F227 = 0x40
}BOARD_TYPE;

传递一个枚举类型总是更好

// Function definition
void do_work(BOARD_TYPE board_type) {
    if (board_type == BOARD_F164) {
        // Do stuff...
    }
}

// Calling
do_work(BOARD_F164);

【讨论】:

  • 是的,很明显。但是后来在阅读代码时,我不知道 F164 是枚举“BOARD_TYPE”的成员。
  • 那么以常量的名义使用它? BOARD_F164
  • 是的,这是可能的。但我仍然想在代码中识别定义值的枚举。@Lundin 对此有一个很好的方法。但感谢您的意见。
  • @Oystein 其他类型不也是这样吗?阅读代码时如何记住变量的类型? F164 也是“不是枚举成员”
  • @Vagish 你说得对——我的术语有点不对劲。 “价值”是一个更好的词。我猜你通常不记得变量的类型。我只想引用枚举名称,以更清楚地说明值“F164”不仅仅是一个定义的值,而是枚举中的一个值。但我认为在函数参数中使用枚举名称作为变量类型是一种好方法。
【解决方案3】:

C 中的enums 不像 Java 中的类。通常,您不能用类型限定enum 的名称。这就是失败的原因:

typedef enum {
  F227 = 0x40 } BOARD_TYPE;

typedef enum {
  F227 = 0x40 } BOARD_TYPE2;

有点难看,但我认为解决这个问题的唯一方法是使用名称中的类型:

typedef enum {
  BOARD_TYPE_F227 = 0x40 } BOARD_TYPE;

【讨论】:

    【解决方案4】:

    只使用枚举值。此外,您可以使用枚举类型作为函数参数。

    void do_work(BOARD_TYPE board_type) {
        if (board_type == F164) {
            // Do stuff...
        }
    }
    

    【讨论】:

    • 据我了解,这不是关于有效性的问题,而是关于可读性的问题。没有需要 用它的类型来限定枚举名称,但有时能够这样做会很好,以使代码更具表现力。我不认为这可以在 C 中完成。
    • 是的,但枚举没有显式类型,因此您可以获得隐式类型转换警告(取决于编译器的警告级别设置)。或者你这样做 if ((BOARD_TYPE)board_type == F164)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多