C语言中枚举类型和typedef使用

枚举类型(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
    };

枚举类型的特点

  1. 枚举常量默认从0开始,依次递增
  2. 可以显式为枚举常量指定整数值
  3. 枚举变量实际上是整数类型

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;

优点

  1. 简化类型名称,无需重复写enum关键字
  2. 提高代码可读性
  3. 便于类型检查和维护

实际应用示例

#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代码更加清晰、易于维护,同时减少重复的类型声明。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值