我在某些代码中使用了函数指针,并且它正在工作,但是发出了警告。我正在学习C,我想了解原因。
这里是包含函数指针的父函数:
void drag_perform64(t_drag *x, double **ins, double **outs, long sampleframes, void (*voicemode)(void *, t_double, t_double, t_double, t_double)){
//... more code here
voicemode(x, this_lo, this_hi, grad, t);
//... more code here
}
这里是我指向
的功能的声明void drag_ptr_voicecalc (t_drag *x, t_double lo, t_double hi, t_double grad, t_double t);
以下是我的称呼方式:
drag_perform64(x, ins, outs, sampleframes, drag_ptr_voicecalc);
但是我收到了这个错误:
passing argument 5 of 'drag_perform64' from incompatible pointer type
expected 'void (*)(void *, t_double, t_double, t_double, t_double)' but argument is of type 'void (*)(struct t_drag *, t_double, t_double, t_double, t_double)'
代码有效,但我无法摆脱警告 - 任何人都可以提出建议吗?
由于
答案 0 :(得分:1)
你的标题是错的。您没有将指向struct的指针转换为void *。您正在将一个函数指针类型转换为不兼容的指针函数类型。
如果调用drag_perform64,则需要将t_drag *作为其第一个参数,并且调用者将t_drag *作为第一个参数传递。如果通过具有错误类型的函数指针调用drag_perform64,它仍然期望t_drag *作为第一个参数,但调用者将在那里放置void *。问题是没有施法。在C和C ++中,不同的指针类型可以具有不同的大小和不同的值。您可以实现void *为64位且t_drag *为32位的实现。你可以想象在那种情况下会出现问题。
答案 1 :(得分:1)
(复制并粘贴评论)
一种解决方案是将drag_ptr_voicecalc
的原型/声明更改为
void drag_ptr_voicecalc (void *x, t_double lo, t_double hi, t_double grad, t_double t)
(使用void *
),然后将void *
转换为该函数内的t_drag *
。
另一种解决方案是将drag_perform64的声明更改为
void drag_perform64(t_drag *x, double **ins, double **outs, long sampleframes, void (*voicemode)(t_drag *, t_double, t_double, t_double, t_double)).