Typedef 函数,它有用吗?
Typedef function and is it useful?
我正在深入学习语言,所以我可以理解代码中发生的事情,而不是打印一些东西然后观察会发生什么。
最近,在寻找 class 函数 table 的更好实现时,我发现自己偶然发现了这个 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);
这个函数的第二个参数是一个指向信号处理函数的指针,它也是returns一个指向信号处理函数的指针。如果没有 typedef,它看起来像这样:
void (*signal(int signum, void (*handler)(int)))(int)
typedef
工具主要用作抽象机制 - 它用于为隐藏或简化实现细节的类型名称创建别名。 stdio.h
中的 FILE
类型可能是 C 中的典型示例 - FILE
是一些其他类型(通常是 struct
类型)的 typedef 名称,它存储状态信息溪流。我们不会直接弄乱 FILE
对象的内容——相反,我们创建一个指向 FILE
的指针,它由各种 C I/O 例程(fopen
、fclose
、fread
、fwrite
、fscanf
、fprintf
等)。
编辑
至于 typedef 函数类型...
您会经常看到它用于简化回调声明:
typedef void (*callback)( /* callback arguments */ );
...
void do_something( T arg1, T arg2, callback c );
callback
是类型 "pointer to function taking some callback arguments and returning void
".
的别名
我正在深入学习语言,所以我可以理解代码中发生的事情,而不是打印一些东西然后观察会发生什么。
最近,在寻找 class 函数 table 的更好实现时,我发现自己偶然发现了这个 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);
这个函数的第二个参数是一个指向信号处理函数的指针,它也是returns一个指向信号处理函数的指针。如果没有 typedef,它看起来像这样:
void (*signal(int signum, void (*handler)(int)))(int)
typedef
工具主要用作抽象机制 - 它用于为隐藏或简化实现细节的类型名称创建别名。 stdio.h
中的 FILE
类型可能是 C 中的典型示例 - FILE
是一些其他类型(通常是 struct
类型)的 typedef 名称,它存储状态信息溪流。我们不会直接弄乱 FILE
对象的内容——相反,我们创建一个指向 FILE
的指针,它由各种 C I/O 例程(fopen
、fclose
、fread
、fwrite
、fscanf
、fprintf
等)。
编辑
至于 typedef 函数类型...
您会经常看到它用于简化回调声明:
typedef void (*callback)( /* callback arguments */ );
...
void do_something( T arg1, T arg2, callback c );
callback
是类型 "pointer to function taking some callback arguments and returning void
".