1

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

2 回答 2

3

你在对编译器撒谎。结果是不可预测的。

于 2013-04-03T00:25:10.110 回答
2

您不能将 avoid*转换为 afloat并期望它起作用。

更好的解决方案是让您的回调函数返回 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);
}

这仍然存在问题 - 您需要提前知道传递给回调的指针指向的变量类型。

于 2013-04-03T00:37:34.577 回答