跨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
相关产品推荐
相关产品推荐

