c - typedef 函数,它有用吗?
问题描述
我正在深入研究语言,所以我可以理解代码中正在发生的事情,而不是打印一些东西然后观察看看会发生什么。
最近,为了更好地实现类函数表,我发现自己偶然发现了这个 C 语言标准:http ://www.iso-9899.info/wiki/Typedef_Function_Type
我已经尝试过了,它似乎工作功能:
typedef void fnr(int x);
main()
{
fnr t;
}
对我来说,这似乎是一个光荣的日子,我正在寻找将函数打包到我的结构中的方法,直到我意识到,这 fnr t;
并不像我预期的那样有用。它既不能被分配,也不能以我希望的正确方式使用(对于 C 用户来说可能是 lambda)。它甚至不存在于反汇编中!
这个语言功能有什么作用?除了简化函数指针,它还能用来做什么?
解决方案
您已声明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)
推荐阅读
- algorithm - 如何使用贪婪启发式解决具有固定起点和终点的旅行推销员问题?
- c++ - MinGW C++ 编译器在系统路径中找不到 OpenCV
- javascript - 如何使用 updateChartType() 使我的下拉菜单动态化?
- php - amzon SP-API ,我们计算的请求签名与您提供的签名不匹配
- javascript - 我们如何在 Node 中设置总请求超时或丢弃请求(使用集群模块时)?
- c# - 如何在 C# 中使用 NPOI 从 excel 文件中正确检索字符串
- c# - c# devexpress空列错误,返回值为空时应用程序崩溃
- c# - 选项模式:两个选项对象,一个需要来自另一个的信息
- java - Java:如何在滚动和打印文本到页面末尾时打破 while 循环
- r - 如何订购堆叠条形图