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

wb-code

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

公告

View Post

函数指针变量使用static关键字几个重要原因

一、static的三种用法回顾

// 1. static用于局部变量:保持值不变
void func(void) {
    static int count = 0;  // 只初始化一次,值在调用间保持
    count++;
}

// 2. static用于全局变量:限制作用域到当前文件
static int private_var;  // 只能在当前.c文件中访问

// 3. static用于函数:限制作用域到当前文件
static void private_func(void) {
    // 只能在当前.c文件中调用
}

二、函数指针使用static的典型场景
场景1:私有回调注册(最常见)

// uart_driver.c - 驱动模块内部
static uart_callback_t uart_receive_func = NULL;  // 私有变量

void UART_RegisterCallback(uart_callback_t callback) {
    uart_receive_func = callback;  // 内部保存
}

static void UART1_IRQHandler(void) {
    if(uart_receive_func != NULL) {
        uint8_t data = UART_ReadData();
        uart_receive_func(data);  // 调用用户注册的回调
    }
}

// 外部不能直接访问uart_receive_func,保证了数据安全

场景2:函数指针数组

// command_processor.c
typedef void (*cmd_handler_t)(void);

static const cmd_handler_t cmd_table[] = {
    cmd_power_on,
    cmd_power_off,
    cmd_reset,
    NULL  // 结束标志
};

// 外部只能通过API访问,不能直接修改表
cmd_handler_t GetCommandHandler(uint8_t cmd_id) {
    if(cmd_id < sizeof(cmd_table)/sizeof(cmd_table[0])) {
        return cmd_table[cmd_id];
    }
    return NULL;
}

三、为什么函数指针需要static?

  1. 信息隐藏
// 没有static - 危险的暴露
uart_callback_t uart_receive_func;  // 全局可见

// 任何文件都可以直接修改:
extern uart_callback_t uart_receive_func;
uart_receive_func = NULL;  // 恶意或意外破坏

// 有static - 安全的封装
static uart_callback_t uart_receive_func;  // 仅本文件可见

// 只能通过提供的API修改
void UART_SetCallback(uart_callback_t func) {
    uart_receive_func = func;  // 可以添加验证逻辑
}
  1. 防止命名冲突
// module1.c
static uart_callback_t callback;  // 模块1的私有回调

// module2.c  
static uart_callback_t callback;  // 模块2的私有回调,互不干扰

// 如果没有static,链接时会报重复定义错误
  1. 保持模块独立性
// uart.c - 串口驱动模块
static uart_callback_t rx_callback;
static uart_callback_t tx_callback;
static uart_callback_t error_callback;

// 这些函数指针是模块内部状态的一部分
// 外部不需要知道它们的存在

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

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