Typedef函数,它有用吗?

时间:2019-03-19 18:42:25

标签: c function function-pointers typedef

我正在深入研究语言,因此我可以了解代码中正在发生的事情,而不是打印一些东西并观察并观察发生的事情。

最近,在寻找更好的类函数表实现时,我发现自己偶然发现了这种C语言标准:http://www.iso-9899.info/wiki/Typedef_Function_Type

我已经尝试过了,它似乎可以正常工作:

typedef void fnr(int x);

main()
{
    fnr t;
}

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

此语言功能有什么作用?除了简化函数指针外,它还能用于什么?

2 个答案:

答案 0 :(得分:8)

您已将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)

答案 1 :(得分:2)

typedef工具主要用作一种抽象机制-它用于为类型名称创建别名,以隐藏或简化实现细节。 FILE中的stdio.h类型可能是C语言中的典型示例-FILE是其他类型(通常是struct类型)的typedef名称,用于存储状态信息。流。我们不会直接弄乱FILE对象的内容-而是创建指向FILE的指针,该指针由各种CI / O例程(fopen,{{1} },fclosefreadfwritefscanf等)。

编辑

关于类型定义函数类型...

您经常会看到它用于简化回调声明:

fprintf

typedef void (*callback)( /* callback arguments */ ); ... void do_something( T arg1, T arg2, callback c ); 是类型“使用一些回调参数返回callback的函数指针”的别名。