函数指针不兼容的指针类型void(*)(void *)from void(my_type *)

时间:2016-07-20 07:21:56

标签: c pointers struct function-pointers

我得到了上述警告并理解它,但只是不知道如何解决它。我的代码如下,但基本上我正在做的是在一个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;

1 个答案:

答案 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浏览器。如果你多考虑一下你的要求,可能会有更好的解决方案。