襄阳市网站建设_网站建设公司_JavaScript_seo优化
2025/12/19 13:00:04 网站建设 项目流程

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);

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询