在下面的代码中,为什么int
有效但float
无效?结果如下。
voidptr.c:
#include <stdio.h>
typedef void* (*Fn) ();
int Fun()
{
return 5;
}
float fFun()
{
return 5.0;
}
void callfun(Fn f)
{
printf ("%d \n", f());
}
void callffun(Fn f)
{
printf ("%f \n", f());
}
int main()
{
callfun(Fun); // works
callffun(fFun); // --> doesnt work ??
printf ("%f", fFun()); // works
return 0;
}
输出:
5
0.000000
5.000000
答案 0 :(得分:3)
你骗了编译器。结果无法预测。
答案 1 :(得分:2)
您无法将void*
投射到float
并希望它可以正常工作。
更好的解决方案是让您的回调函数返回void,但接受void *作为删除返回值的位置:
typedef void (*Fn) (void *);
void Fun(void *ptr)
{
*(int *)ptr = 5;
}
void fFun(void *ptr)
{
*(float *)ptr = 5.0;
}
void callfun(Fn f)
{
int num;
f(&num);
printf ("%d \n", num);
}
void callffun(Fn f)
{
float num;
f(&num);
printf ("%f \n", num);
}
这仍有问题 - 您需要事先知道传递给回调的指针指向哪种变量。