是否允许通过伪通用函数指针调用具有不同原型的函数?

时间:2016-06-04 16:35:35

标签: c function-pointers

假设所有函数共享相同的返回类型,通过“泛型”函数指针调用每个函数是否有效,该指针是用空括号声明的(因此它不指定其参数)?

这是一个示例代码,用于说明它:

#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;
}

1 个答案:

答案 0 :(得分:6)

你可能会做类似的事情,但不是那样。当您通过函数指针调用函数时,您必须确保调用端的原型与函数定义完全一样。

现在,带有空括号的函数声明甚至不是原型,因此这不是调用它的正确方法。主要原因是呼叫惯例可能与您预期的略有不同。对于()函数,适用特殊规则,即将窄类型转换为intunsigneddouble

现在你可以做的是存储一个pf中的函数指针,但是你必须在它之前将它转换回正确的函数指针。打电话,如

((void (*)(int, int))pf)(a, b);

这几乎是不易阅读和错误的。你应该尽可能地避免这种体操。