函数指针不兼容的指针类型 void (*)(void *) from void (my_type *)
function pointer incompatible pointer types void (*)(void *) from void (my_type *)
我收到上述警告并理解它,但不知道如何修复它。我的代码在下面,但基本上我所做的是在结构中存储一个函数指针,并在我从 main.c 调用的另一个函数中初始化该结构。当我将代码与默认函数(即 free())一起使用时,代码似乎可以编译,但当我将它与下面的 test_func 函数一起使用时,代码似乎无法编译。想法?
结构:
typedef struct my_struct {
my_type **double_pointed;
int num;
void (*funcp)(void *data);
} my_struct_t;
初始化函数:
my_struct_t *init(int num, void (*my_funcp)(void *data)) {
// unimportant code to the problem, but basically just some mallocs for the other data
my_struct_t *my_str;
my_str->funcp = my_funcp;
return struct;
}
我要指向的功能:
void desired_func(my_type *obj) {}
我对初始化函数的调用:
init(5, desired_func);
全部错误:
分配给 'void (*)(void *)' 的不兼容指针类型
'void (my_type *)'
在上面的 init 函数中的行:
my_struct_t *my_str;
my_str->funcp = my_funcp;
更改函数指针类型以匹配函数,即。 :
void (*funcp)(my_type *data);
如果您希望能够使用具有不同签名的函数(例如,不同的参数类型),您可以添加显式转换。例如:
init(5, (void (*)(void*)) desired_func);
请注意,任何时候 desired_func
函数(或签名与 funcp
函数指针不匹配的任何其他函数)需要通过函数指针调用时,函数指针将具有在调用函数之前转换回其原始类型(void (*)(my_type*)
在这种情况下),或者调用未定义的行为。
另一种(更好一些)替代方法是像这样更改 desired_func
定义:
void desired_func(void *vobj) {
my_type* obj = vobj;
/* rest of the code */
}
注意在调用desired_func
时(通过函数指针或直接调用),地址作为参数传递的对象的类型需要是my_type
,或者解引用obj
在函数内部(如果对齐方式不同甚至转换本身)将调用未定义的行为。
转换时处理潜在未定义行为的额外复杂性(如上所述)意味着我建议不要转换 - 需要这样的转换可能表明您的设计存在问题。 IE。如果您多考虑一下您的要求,可能会有更好的解决方案。
我收到上述警告并理解它,但不知道如何修复它。我的代码在下面,但基本上我所做的是在结构中存储一个函数指针,并在我从 main.c 调用的另一个函数中初始化该结构。当我将代码与默认函数(即 free())一起使用时,代码似乎可以编译,但当我将它与下面的 test_func 函数一起使用时,代码似乎无法编译。想法?
结构:
typedef struct my_struct {
my_type **double_pointed;
int num;
void (*funcp)(void *data);
} my_struct_t;
初始化函数:
my_struct_t *init(int num, void (*my_funcp)(void *data)) {
// unimportant code to the problem, but basically just some mallocs for the other data
my_struct_t *my_str;
my_str->funcp = my_funcp;
return struct;
}
我要指向的功能:
void desired_func(my_type *obj) {}
我对初始化函数的调用:
init(5, desired_func);
全部错误:
分配给 'void (*)(void *)' 的不兼容指针类型 'void (my_type *)'
在上面的 init 函数中的行:
my_struct_t *my_str;
my_str->funcp = my_funcp;
更改函数指针类型以匹配函数,即。 :
void (*funcp)(my_type *data);
如果您希望能够使用具有不同签名的函数(例如,不同的参数类型),您可以添加显式转换。例如:
init(5, (void (*)(void*)) desired_func);
请注意,任何时候 desired_func
函数(或签名与 funcp
函数指针不匹配的任何其他函数)需要通过函数指针调用时,函数指针将具有在调用函数之前转换回其原始类型(void (*)(my_type*)
在这种情况下),或者调用未定义的行为。
另一种(更好一些)替代方法是像这样更改 desired_func
定义:
void desired_func(void *vobj) {
my_type* obj = vobj;
/* rest of the code */
}
注意在调用desired_func
时(通过函数指针或直接调用),地址作为参数传递的对象的类型需要是my_type
,或者解引用obj
在函数内部(如果对齐方式不同甚至转换本身)将调用未定义的行为。
转换时处理潜在未定义行为的额外复杂性(如上所述)意味着我建议不要转换 - 需要这样的转换可能表明您的设计存在问题。 IE。如果您多考虑一下您的要求,可能会有更好的解决方案。