枚举类型(enum)的使用
枚举类型用于定义一组相关的命名常量,提高代码可读性。
基本定义方式
enum 枚举名 {
标识符1,
标识符2,
...
标识符n
};
示例
#include <stdio.h>
// 定义枚举类型,
enum Weekday
{
MONDAY, // default is 0
TUESDAY, // 1
WEDENSDAY, // 2
THURSDAY, // 3
FRIDAY, // 4
SATURDAY, // 5
SUNDAY //6
};
int main()
{
// 使用枚举类型
enum Weekday today = THURSDAY;
printf("today is %d\n", today); // 3
return 0;
}
显式赋值
enum Color {
RED = 1,
GREEN = 2,
BLUE = 4,
YELLOW = 8
};
枚举类型的特点
- 枚举常量默认从0开始,依次递增
- 可以显式为枚举常量指定整数值
- 枚举变量实际上是整数类型
typedef的使用
typedef用于为现有类型创建别名,简化复杂类型的声明。
基本语法
typedef 原类型名 新类型名;
基本类型别名
typedef unsigned int UINT;
typedef float REAL;
UINT a = 10;
REAL b = 3.14;
结构体别名
#include <stdio.h>
// typedef 以分号结尾
typedef unsigned int UINT16;
typedef float REAL;
// 传统方式, struct 以分号结尾
// struct 和 enum 定义以 ; 结尾,是因为它们是声明语句,必须遵循 C 语言的语法规则
struct Point{
int x;
int y;
};
// typedef 方式定义
typedef struct {
int x;
int y;
} Point_t;
int
main()
{
struct Point p1= {2, 4};
Point_t p2 = {3, 5}; // 无需写struct关键字
printf("p1 = (%d, %d)\n", p1.x, p1.y);
printf("p2 = (%d, %d)\n", p2.x, p2.y);
return 0;
}
枚举类型别名
// 传统方式
enum Weekday
{
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
};
// typedef 方式
typedef enum Weekday Weekday_e;
enum Weekday today = THURSDAY;
Weekday_e yesday = WEDNESDAY; // 无需enum关键字
指针类型别名
typedef char* String;
String s1 = "Hello";
String s2 = "World";
函数指针别名
typedef int (*CompareFunc)(const void*, const void*);
CompareFunc cmp = strcmp;
完整实例与输出
#include <stdio.h>
// typedef 以分号结尾
typedef unsigned int UINT16;
typedef float REAL;
// 传统方式, struct 以分号结尾
// struct 和 enum 定义以 ; 结尾,是因为它们是声明语句,必须遵循 C 语言的语法规则
struct Point{
int x;
int y;
};
// typedef 方式定义
typedef struct {
int x;
int y;
} Point_t;
// 传统方式
enum Weekday
{
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
};
// typedef 方式
typedef enum Weekday Weekday_e;
int main()
{
struct Point p1= {2, 4};
Point_t p2 = {3, 5}; // 无需写struct关键字
printf("p1 = (%d, %d)\n", p1.x, p1.y);
printf("p2 = (%d, %d)\n", p2.x, p2.y);
enum Weekday today = THURSDAY;
Weekday_e yesday = WEDNESDAY; // 无需enum关键字
printf("yesterday %d, today %d\n", yesday, today);
return 0;
}
输出:
p1 = (2, 4)
p2 = (3, 5)
yesterday 2, today 3
枚举与typedef结合使用的最佳实践
// 推荐用法:typedef与enum结合
typedef enum {
STATE_IDLE,
STATE_RUNNING,
STATE_PAUSED,
STATE_STOPPED
} SystemState;
SystemState currentState = STATE_IDLE;
优点
- 简化类型名称,无需重复写enum关键字
- 提高代码可读性
- 便于类型检查和维护
实际应用示例
#include<stdio.h>
// 定义枚举类型别名
typedef enum
{
OFF,
ON,
BLINKING
} LedState;
// 定义结构体类型别名
typedef struct
{
int id;
LedState state;
float brightness;
} LedDevice;
int main()
{
LedDevice led1 = {1, ON, 0.8};
LedDevice led2 = {2, OFF, 0.5};
printf("LED %d is %s at %.1f brightness\n",
led1.id,
led1.state == ON ? "ON" : (led1.state == OFF ? "OFF" : "BLINKING"),
led1.brightness);
printf("LED %d is %s at %.1f brightness\n",
led2.id,
led2.state == ON ? "ON" : (led2.state == OFF ? "OFF" : "BLINKING"),
led2.brightness);
return 0;
}
输出:
LED 1 is ON at 0.8 brightness
LED 2 is OFF at 0.5 brightness
通过合理使用typedef和enum,可以使C代码更加清晰、易于维护,同时减少重复的类型声明。