为什么返回float的函数不能与void * callback一起使用?

时间:2013-04-03 00:22:42

标签: c callback

在下面的代码中,为什么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

2 个答案:

答案 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);
}

这仍有问题 - 您需要事先知道传递给回调的指针指向哪种变量。