在C中使用枚举名称的枚举成员

时间:2017-08-25 07:55:24

标签: c enums

我定义了以下枚举:

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

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

{{1}}

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

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

4 个答案:

答案 0 :(得分:6)

enum是一个值列表,即“枚举”。它不是带成员的struct / container类。

现在为了清楚起见要做的是仅将给定类型的枚举常量与相同类型的变量进行比较。与您的示例中的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;

答案 1 :(得分: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);

答案 2 :(得分:1)

C语言中的{p> enum类似于Java语言。通常,您无法使用其类型限定enum的名称。这就是为什么失败的原因:

typedef enum {
  F227 = 0x40 } BOARD_TYPE;

typedef enum {
  F227 = 0x40 } BOARD_TYPE2;

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

typedef enum {
  BOARD_TYPE_F227 = 0x40 } BOARD_TYPE;

答案 3 :(得分:0)

只需使用枚举值即可。另外,您可以使用enum-type作为函数参数。

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