簡體   English   中英

在C中使用具有枚舉名稱的枚舉成員

[英]Using enum members with enum name in C

我定義了以下枚舉:

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'之前的期望表達式”。

那么使用枚舉成員同時引用枚舉名稱以提高代碼可讀性的正確方法是什么?

enum是值列表,即“枚舉”。 它不是具有成員的struct / container類。

現在,為清楚起見,您應該做的只是將給定類型的枚舉常量與相同類型的變量進行比較。 不像您的示例那樣針對uint8_t

這幾乎是自我記錄的代碼:

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

可以將好的編譯器配置為在將枚舉與錯誤類型進行比較時發出警告。 否則,您還可以使用一些技巧來創建類型安全的枚舉

您還可以在所有枚舉常量前添加前綴,以指示它們所屬的類型-這是常見的做法:

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

枚舉不是結構,成員名稱只是相應常量的名稱,因此您不能通過來訪問枚舉元素.

更改

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);

C中的enum不是Java中的類。 通常,您不能用其類型來限定enum的名稱。 這就是失敗的原因:

typedef enum {
  F227 = 0x40 } BOARD_TYPE;

typedef enum {
  F227 = 0x40 } BOARD_TYPE2;

這有點丑陋,但我認為解決此問題的唯一方法是在名稱中使用類型:

typedef enum {
  BOARD_TYPE_F227 = 0x40 } BOARD_TYPE;

只需使用枚舉值即可。 另外,您可以使用enum-type作為函數參數。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM