带有未确定参数的函数指针

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

下面的例子(第1行),我希望void (*fp)(int)能够取得void (*fp)(char*) 。 下面的代码没有正确编译,因为我传递char * where 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 *。

我会说使用void (*fp)(void*) ,然后将指针传递给你的变量并将它们转换为void *。 它非常hacky,但它应该工作。

例如:

 void callIt(void (*fp)(void*)) { int x = 5; (*fp)((void*)&x); } 

您期望对stringPrint的调用完全正确吗?

看起来如果你确实这样做了,它最终会尝试将内存位置5的内容打印为字符串。 我怀疑它不是你想要的,因为它会崩溃,我怀疑你打算输出’5’。

还要注意……至少需要一个命名参数。 传递空白*和滥用数量的铸造将至少编译。

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

只需将其定义为

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

你唯一要确定的是你调用它的方式与你指定的function相匹配。

 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)); ... 

为什么不将它作为接受void *参数的函数指针?

 void(*fp)(void*) 

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