在 C 語言中使用 typedef enum

Jinku Hu 2023年1月30日 2021年1月22日
  1. 使用 enum 在 C 語言中定義命名整數常量
  2. 使用 typedef enum 定義包含命名整數常量的物件的定製型別
在 C 語言中使用 typedef enum

本文將演示關於如何在 C 語言中使用 typedef enum 的多種方法。

使用 enum 在 C 語言中定義命名整數常量

enum 關鍵字定義了一種叫做列舉的特殊型別。列舉基本上只是整數值,其名稱為變數,但卻是隻讀物件,在執行時不能修改。

構造一個列舉物件有兩種方法,一種是宣告每個成員,不分配顯式值,而是根據位置自動推導值;另一種是宣告成員,分配顯式值。

在下面的例子中,我們為每個成員分配自定義值,並將物件命名為-STATE。接下來,我們就可以在程式碼中把 STATE 物件的成員名作為有符號整數,並在表示式中對其進行評估。下面的示例程式碼演示了多個條件語句,檢查輸入的整數是否等於定義的常量,一旦匹配,就列印出相應的合適的字串。

#include <stdio.h>
#include <stdlib.h>

enum STATE{
    RUNNING = 49,
    STOPPED = 50,
    FAILED = 51,
    HIBERNATING = 52
};

int main(void) {
    int input1;

    printf("Please provide integer in range [1-4]: ");
    input1 = getchar();

    if (input1 == STOPPED) {
        printf("Machine is stopped\n");
    } else if (input1 == RUNNING) {
        printf("Machine is running\n");
    } else if (input1 == FAILED) {
        printf("Machine is in failed state\n");
    } else if (input1 == HIBERNATING) {
        printf("Machine is hibernated\n");
    }

    exit(EXIT_SUCCESS);
}

輸出:

Please provide integer in range [1-4]: 2
Machine is running

使用 typedef enum 定義包含命名整數常量的物件的定製型別

typedef 關鍵字用於命名使用者定義的物件。在程式碼中經常需要多次宣告結構。如果不使用 typedef 來定義它們,每次宣告都需要以 struct/enum 關鍵字開始,這就使得程式碼的可讀性變得很重。

但請注意,typedef 只是為給定型別建立一個新的別名,而不是建立一個新的型別。許多整數型別如 size_tuint 等只是其他內建型別的 typedef。因此,使用者可以為內建型別宣告多個別名,然後使用已經建立的別名來鏈式宣告額外的 typedef

#include <stdio.h>
#include <stdlib.h>

typedef enum{
    RUNNING = 49,
    STOPPED = 50,
    FAILED = 51,
    HIBERNATING = 52
} MACHINE_STATE;

int main(void) {
    int input1;
    MACHINE_STATE state;

    printf("Please provide integer in range [1-4]: ");
    input1 = getchar();
    state = input1;

    switch (state) {
        case RUNNING:
            printf("Machine is running\n");
            break;
        case STOPPED:
            printf("Machine is stopped\n");
            break;
        case FAILED:
            printf("Machine is in failed state\n");
            break;
        case HIBERNATING:
            printf("Machine is hibernated\n");
            break;
        default:
            break;
    }

    exit(EXIT_SUCCESS);
}

輸出:

Please provide integer in range [1-4]: 2
Machine is running
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn