首页 > 解决方案 > typedef 函数,它有用吗?

问题描述

我正在深入研究语言,所以我可以理解代码中正在发生的事情,而不是打印一些东西然后观察看看会发生什么。

最近,为了更好地实现类函数表,我发现自己偶然发现了这个 C 语言标准:http ://www.iso-9899.info/wiki/Typedef_Function_Type

我已经尝试过了,它似乎工作功能:

typedef void fnr(int x);

main()
{
    fnr t;
}

对我来说,这似乎是一个光荣的日子,我正在寻找将函数打包到我的结构中的方法,直到我意识到,这 fnr t;并不像我预期的那样有用。它既不能被分配,也不能以我希望的正确方式使用(对于 C 用户来说可能是 lambda)。它甚至不存在于反汇编中!

这个语言功能有什么作用?除了简化函数指针,它还能用来做什么?

标签: cfunctionfunction-pointerstypedef

解决方案


您已声明fnr为函数类型。虽然不能分配函数类型,但指向函数类型的指针可以。例如:

typedef void fnr(int x);

void f(int x)
{
    printf("x=%d\n", x);
}

int main()
{
    fnr *t = f;
    t(1);
}

您还可以将 typedef 定义为函数指针:

typedef void (*fnr)(int x);
...
fnr t = f;

当函数指针被传递给函数或从函数返回时,对函数指针使用 typedef 是最有用的。作为一个例子,让我们看一下signal两者兼有的函数:

  typedef void (*sighandler_t)(int);

  sighandler_t signal(int signum, sighandler_t handler);

该函数的第二个参数是一个指向信号处理函数的指针,它还返回一个指向信号处理函数的指针。如果没有 typedef,它看起来像这样:

void (*signal(int signum, void (*handler)(int)))(int)

推荐阅读