假设所有函数共享相同的返回类型,通过“泛型”函数指针调用每个函数是否有效,该指针是用空括号声明的(因此它不指定其参数)?
这是一个示例代码,用于说明它:
#include <stdio.h>
void fun1(void)
{
printf("fun1\n");
}
void fun2(int a)
{
printf("fun2: %d\n", a);
}
void fun3(int a, int b)
{
printf("fun3: %d %d\n", a, b);
}
int main(void)
{
void (*pf)(); // pseudo-generic function pointer
pf = fun1;
pf();
pf = fun2;
pf(0);
pf = fun3;
pf(1, 2);
return 0;
}
答案 0 :(得分:6)
你可能会做类似的事情,但不是那样。当您通过函数指针调用函数时,您必须确保调用端的原型与函数定义完全一样。
现在,带有空括号的函数声明甚至不是原型,因此这不是调用它的正确方法。主要原因是呼叫惯例可能与您预期的略有不同。对于()
函数,适用特殊规则,即将窄类型转换为int
,unsigned
或double
。
现在你可以做的是存储一个pf
中的函数指针,但是你必须在它之前将它转换回正确的函数指针。打电话,如
((void (*)(int, int))pf)(a, b);
这几乎是不易阅读和错误的。你应该尽可能地避免这种体操。