我想要一个可以采用各种类型参数的函数指针。我该怎么做?
以下示例(第1行),我希望void (*fp)(int)
也可以使用void (*fp)(char*)
。下面的代码没有正确编译,因为我传递char *,其中int是预期的,因此编译以下代码会给你警告(并且将无法正常工作)。
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 *。
答案 0 :(得分:3)
我会说使用void (*fp)(void*)
,然后将指针传递给你的变量并将它们转换为void *。它非常hacky,但它应该可以工作。
例如:
void callIt(void (*fp)(void*))
{
int x = 5;
(*fp)((void*)&x);
}
答案 1 :(得分:1)
您期望对stringPrint的调用完全正确吗?
看起来如果你确实这样做了,它最终会尝试将内存位置5的内容打印为字符串。我怀疑这不是你想要的,因为它会崩溃,我怀疑你打算输出'5'。
另请注意......至少需要一个命名参数。传递空白*和滥用数量的投射至少会编译。
答案 2 :(得分: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));
...
答案 3 :(得分:0)
为什么不将它作为接受void *参数的函数指针?
void(*fp)(void*)
这将处理所有可能的指针参数。现在对于数据类型,您可以为每个函数指针类型创建一个函数指针类型,或仅为将要与函数指针一起使用的函数,将数据类型作为指针传递,并在函数的开头取消引用它们。这只是一个想法,却不知道你想要做什么。