You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨C文件用函数指针为结构体成员赋值时出现未定义引用错误

如何将外部文件的函数赋值给结构体的函数指针成员?

问题场景

当函数与结构体定义在同一文件时,将函数赋值给结构体的函数指针成员完全正常:

static void a_func(int param1, /*...*/) {
    //...
}

static const struct bt_mesh_handlers my_handlers = {
    .set = a_func,
    // ...
};

但将函数移至外部文件后,编译时出现链接错误:undefined reference to 'a_func',代码结构如下:

头文件

// function declaration:
void a_func(int param1, /*...*/);

函数实现文件

// function definition (已移除错误的static修饰)
void a_func(int param1, /*...*/) {
    //...
}

主文件

#include "myheader.h"

static const struct bt_mesh_handlers my_handlers = {
    .set = a_func,
    // ...
};

解决方案

  • 确保编译时包含函数实现的源文件
    该错误属于链接错误,本质是链接器找不到a_func的二进制实现代码。编译时必须把定义a_func的C文件加入编译列表:
    例如gcc编译命令:

    gcc main.c a_func.c -o target
    

    若使用Makefile,需将该C文件添加到编译依赖的源文件集合中。

  • 校验函数声明与定义的一致性
    必须保证头文件中的函数声明,与C文件中的函数定义在返回值类型、参数类型及个数上完全一致。任何不一致都可能导致链接器无法匹配到正确的函数。

  • 确认函数无static修饰
    static关键字会限制函数的作用域为当前文件,外部无法访问。你已经移除了函数定义的static修饰,这一步是正确的,要确保后续也不会误加。

  • 直接使用函数名赋值即可
    在C语言中,函数名本身就是指向该函数的指针,所以.set = a_func的写法完全合法,无需额外转换或生成单独的函数指针变量。只要函数能被正常链接,这个赋值操作就会生效。

内容的提问来源于stack exchange,提问作者Sespaetzlean

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 06:10:30