【问题标题】:Is this allowed to call functions with different prototypes by a pseudo-generic function pointer?这是否允许通过伪通用函数指针调用具有不同原型的函数?
【发布时间】:2016-06-04 16:35:35
【问题描述】:

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

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

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

【问题讨论】:

  • 有趣的问题。有效,如“它是否按预期编译和运行?”是的,是否说“使用-Wall 编译没有警告?”在我的编译器上是的:-)
  • 是的,即使在偏执模式 -Wall -Wextra -pedantic -Wconversion GCC 4.9 下也不会发出警告... @Dilettant
  • 根据 K&R 是合法的。
  • @GrzegorzSzpetkowski 我猜这个问题更多的是关于声明的合法性而不是它的语义。我将撤回接近投票。

标签: c function-pointers


【解决方案1】:

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

现在,带有空括号的函数声明甚至不是原型,所以这不是调用它的正确方法。主要原因是调用约定可能与您预期的略有不同。对于() 函数适用特殊规则,即窄类型转换为int、unsigned 或double。

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

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

这很难读,而且很容易出错。你应该尽量避免这样的体操。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-19
    • 2018-06-08
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    相关资源
    最近更新 更多