铸造指针&得到警告

时间:2015-07-17 17:17:49

标签: c pointers

我在某些代码中使用了函数指针,并且它正在工作,但是发出了警告。我正在学习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)'   

代码有效,但我无法摆脱警告 - 任何人都可以提出建议吗?

由于

2 个答案:

答案 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)).