在 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_t
、uint
等只是其他內建型別的 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
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