我正在寻找答案,如果示例函数转换和调用在 C 中有效(如果没有任何示例,如何获得类似的行为会很好)。
例子:
#include <stdio.h>
#include <stdint.h>
typedef struct {
uint32_t a;
} parent_t;
typedef struct {
parent_t parent;
uint32_t b;
} child_t;
typedef void (*funct_ptr_t)(parent_t* pParent, uint32_t x);
void test_function(child_t* pChild, uint32_t x);
int main()
{
funct_ptr_t func = (funct_ptr_t)test_function;
funct(NULL, 0U);
return 0;
}
void test_function(child_t* pChild, uint32_t x) {
// do something
}
Run Code Online (Sandbox Code Playgroud)
@编辑如上所述无效,我还想询问第二种方法
typedef void (*funct_ptr_t)(void* pChild, uint32_t x);
void test_function(child_t* pChild, uint32_t x);
int main()
{
funct_ptr_t func = (funct_ptr_t)test_function;
child_t child;
func(&child, 0U);
return 0;
}
void test_function(child_t* pChild, uint32_t x) {
// do something
}
Run Code Online (Sandbox Code Playgroud)
这是无效的。
函数只能通过兼容的函数指针类型调用。为了使两个函数指针类型兼容,相应的参数必须具有兼容的类型,并且返回类型必须兼容。
test_function具有类型void (*)(child_t*, uint32_t ),但正在通过类型为 的函数指针进行调用void (*)(parent_t*, uint32_t )。这意味着该函数是通过不兼容的类型调用的,并且这样做会触发未定义的行为。
如果您尝试接受第一个参数指向不同类型的指针,则处理此问题的最简单方法是将函数和函数指针的第一个参数的类型更改为void *,然后在函数内部执行必要的转换。
另一种选择是将第一个参数的类型更改为test_functiontoparent_t *并在函数内执行强制转换。这将起作用,因为指向结构的指针可以转换为指向其第一个成员的指针,因此您可以这样做:
void test_function(parent_t* pChild, uint32_t x);
int main()
{
funct_ptr_t func = (funct_ptr_t)test_function;
child_t c;
funct((parent_t *)&c, 0U);
return 0;
}
void test_function(parent_t* p, uint32_t x) {
child_t *p_Child = (p_Child *)p;
// do something
}
Run Code Online (Sandbox Code Playgroud)