Typedef函数,它有用吗? [重复]

问题描述 投票:1回答:2

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

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

我已经尝试过,看起来很有效:

typedef void fnr(int x);

main()
{
    fnr t;
}

这对我来说是一个光荣的日子,我正在寻找将功能打包到我的结构中的方式,直到我意识到,fnr t;没有我想象的那么有用。它既不能分配,也不能以我希望的方式使用(可能是C用户的lambda)。它甚至不存在于拆卸中!

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

c function function-pointers typedef
2个回答
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)

2
投票

typedef工具主要用作抽象机制 - 它用于为类型名称创建别名,隐藏或简化实现细节。 FILE中的stdio.h类型可能是C中的典型示例 - FILE是存储流的状态信息的其他类型(通常是struct类型)的typedef名称。我们不直接混淆FILE对象的内容 - 相反,我们创建了一个指向FILE的指针,该指针由各种C I / O例程(fopenfclosefreadfwritefscanffprintf等)操作。

编辑

至于typedefing功能类型......

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

typedef void (*callback)( /* callback arguments */ );
...
void do_something( T arg1, T arg2, callback c );

callback是“指向函数获取一些回调参数并返回void”类型的别名。

© www.soinside.com 2019 - 2024. All rights reserved.