typedef void(*func)(int) VS void(*func)(int) 的区别
一、本质区别
1、void(*func)(int) ——声明变量
-
func是一个变量 -
占用内存空间(通常4或8字节) -
可以赋值、可以修改 -
作用域为当前代码块
2、 typedef void(*func)(int) - 类型定义
-
func是一个类型名 -
不占用内存空间(编译时概念) -
用于声明多个同类型变量 -
作用域遵循普通标识符规则
二、使用场景对比:
1、单个函数指针变量
// 直接声明变量
void (*callback)(int); // 定义一个函数指针变量callback// 赋值使用
void my_func(int x) {printf("Value: %d\n", x);
}callback = my_func; // 正确
callback(10); // 调用
2、需要多个同类型函数指针
// 没有typedef - 冗长易错
void (*func1)(int);
void (*func2)(int);
void (*func3)(int);
void (*array[5])(int); // 函数指针数组,语法复杂// 使用typedef - 简洁清晰
typedef void (*FuncPtr)(int);FuncPtr func1; // 声明变量
FuncPtr func2;
FuncPtr func3;
FuncPtr array[5]; // 声明数组
三、嵌入式开发中的实际应用
1、驱动回调
// 定义回调类型
typedef void (*UART_RxCallback_t)(uint8_t data);
typedef void (*UART_TxCallback_t)(void);// 驱动程序结构
typedef struct {UART_RxCallback_t rx_callback;UART_TxCallback_t tx_callback;// 其他配置
} UART_Config_t;// 使用
UART_Config_t uart1_config = {.rx_callback = my_rx_handler,.tx_callback = NULL
};
2、状态机回调
// 状态处理函数类型
typedef void (*StateHandler_t)(void *context);// 状态表
typedef struct {StateHandler_t enter_handler;StateHandler_t execute_handler;StateHandler_t exit_handler;
} State_t;// 状态数组
State_t states[] = {{idle_enter, idle_execute, idle_exit},{run_enter, run_execute, run_exit},{error_enter, error_execute, error_exit}
};
四、建议
在嵌入式开发中:
(1)总是为函数指针使用typedef
-
提高代码可读性 -
方便参数传递 -
简化复杂声明
(2)命名约定
typedef void (*TimerCallback_t)(void *arg); // _t后缀表示类型
typedef void (*UART_ISR_t)(uint8_t data);