我得到了上述警告并理解它,但只是不知道如何解决它。我的代码如下,但基本上我正在做的是在一个struct中存储一个函数指针,并在我从main调用的另一个函数中初始化该struct。代码似乎是在我使用默认函数(即free())时编译的,但是当我将它与下面的test_func函数一起使用时却没有。想法?
STRUCT:
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 func的调用:
init(5, desired_func);
完整错误:
指向'void(*)(void *)'的不兼容指针类型 'void(my_type *)'
在上面的init函数的行上:
my_struct_t *my_str;
my_str->funcp = my_funcp;
答案 0 :(得分:4)
更改函数指针类型以匹配函数,即。 :
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
内取消引用value
函数(如果对齐甚至演员本身也不同)将调用未定义的行为。
在施法时处理未定义行为可能性的额外复杂性(如上所述)意味着我会建议不要施放 - 需要这样的演员可能表明你的设计存在问题。 IE浏览器。如果你多考虑一下你的要求,可能会有更好的解决方案。