提问人:Sespaetzlean 提问时间:5/21/2023 最后编辑:Sespaetzlean 更新时间:5/23/2023 访问量:162
通过函数指针使用其他 C 文件中的函数
Use function from other C file by a function pointer
问:
首先,我不确定标题是否很好地描述了问题,可以随意更改或建议更合适的标题。
我有以下问题: 我需要将函数指针传递给某个结构。当我在同一文件中定义函数时,这工作得很好。看这里:
static void a_func(int param1, /*...*/) {
//...
}
static const struct bt_mesh_handlers my_handlers = {
.set = a_func,
// ...
};
当我现在在另一个文件中定义此函数时,我无法让它工作: 头文件(此处未显示包括防护):
//function declaration:
void a_func(int param1, /*...*/);
C 文件:
//function definition (this was defined wrongly as static before)
void a_func(int param1, /*...*/) {
//...
}
在主文件中:
#include "myheader.h"
static const struct bt_mesh_handlers my_handlers = {
.set = a_func,
// ...
};
当我将函数外包给另一个文件时,我在构建过程中出现以下错误:
未定义对“a_func”的引用
我已经做了一些研究,我比较确定在定义a_func的文件中,会自动生成一个同名的函数指针。因此,我可以使用该指针将我的函数移交给结构体。
但是我不知道如何将该函数指针从外包文件获取到我的主文件中。 一个好的解决方案会是什么样子?
答:
静态函数应在使用静态函数的每个翻译单元中定义,因为它具有内部链接。因此,在您的示例中,函数未定义,main
要么在标头中定义它(例如,您可以将其定义为内联函数),要么删除存储类说明符以使函数具有外部链接。static
评论
从 的声明中删除 ,包括其定义。static
a_func
在此上下文中,赋予标识符内部链接,这意味着名称的使用将仅链接到同一翻译单元(正在编译的源文件,包括它直接或间接包含的所有文件)中的名称定义。static
a_func
要链接到另一个翻译单元中定义的名称,您需要外部链接。这是函数的默认设置,因此删除将为您提供外部链接。static
我已经做了一些研究,我比较确定在定义a_func的文件中,会自动生成一个同名的函数指针。
函数的名称是指函数。它指定函数。在 C 中,函数指示符会自动转换为指向函数的指针,除非它是 的操作数或一元。在定义该指针的文件中,没有与函数同名的函数指针的特殊或单独的“生成”。编译器、链接器和/或程序加载程序协同工作,以了解函数的位置,并生成适当的指令来使用该函数或提供其地址。sizeof
&
评论
总结一下:问题是我的文件没有正确链接。 可以从不同的文件调用函数并使用其指针 (一开始对我不起作用)。 埃里克(Eric)通过指示符很好地解释了这是如何工作的。
上一个:C++ 作为 FFI 语言
下一个:更改热图的距离和链接
评论