• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

wb-code

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

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

  1.     提高代码可读性
    
  2.     方便参数传递
    
  3.     简化复杂声明
    

(2)命名约定

typedef void (*TimerCallback_t)(void *arg);    // _t后缀表示类型
typedef void (*UART_ISR_t)(uint8_t data);

posted on 2025-12-19 12:56  心事不在脸上  阅读(0)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3