4

我想要一个可以接受各种类型参数的函数指针。我怎么做?

下面的例子(第 1 行),我也希望void (*fp)(int)能够采用void (*fp)(char*)。以下代码无法正确编译,因为我在预期 int 的地方传递了 char*,因此编译以下代码会给您警告(并且无法正常工作)。

void callIt(void (*fp)(int))
{
    (*fp)(5);
}

void intPrint(int x)
{
    printf("%d\n", x);
}

void stringPrint(char *s)
{
    printf("%s\n", s);
}

int main()
{
    void (*fp1)(int) = intPrint;
    callIt(fp1);
    void (*fp2)(char*) = stringPrint;
    callIt(fp2);
    return 0;
}

注意:我知道尝试将整数 5 作为 char* 参数传递是愚蠢的,但这不是这个问题的关注点。如果需要,可以将 char* 替换为 float。

4

4 回答 4

3

我会说 use void (*fp)(void*),然后传入指向变量的指针并将它们转换为 void*。这很hacky,但它应该可以工作。

例如:

void callIt(void (*fp)(void*))
{
    int x = 5;
    (*fp)((void*)&x);
}
于 2012-07-19T14:24:42.620 回答
1

您希望对 stringPrint 的调用究竟能做什么?

看起来好像你确实让这个工作了,它最终会尝试将内存位置 5 的内容打印为字符串。我怀疑这不是你想要的,因为它会崩溃,我怀疑你打算输出“5”。

另请注意 ... 至少需要一个命名参数。传递一个 void * 和大量的强制转换至少会编译。

于 2012-07-19T14:25:42.270 回答
1

虽然不好,但函数指针的类型并不重要。

只需将其定义为

typedef void (*fp_t)(void * pv);

您唯一需要确保的是您调用它的方式与您分配给它的功能相匹配。

int intFuncWithTwoDoubles(double d1, double d2);
char * pCharFuncWithIntAndPointer(int i, void * pv);

...

fp_t fp = NULL;

fp = intFuncWithTwoDoubles;
printf("%d", fp(0.0, 1.0));

fp = pCharFuncWithIntAndPointer;
printf("%s", fp(1, NULL));

...
于 2012-07-19T14:31:15.007 回答
0

为什么不让它成为一个接受 void* 参数的函数指针?

void(*fp)(void*) 

这将处理所有可能的指针参数。现在对于数据类型,您可以为每个函数创建一个函数指针类型,或者只为将要与函数指针一起使用的函数创建一个函数指针类型,将数据类型作为指针传递并在函数的开头取消引用它们。这只是一个想法,不知道你想做什么。

于 2012-07-19T14:26:45.920 回答