C语言 混淆了信号函数的声明

nwnhqdif  于 2023-04-29  发布在  其他
关注(0)|答案(1)|浏览(89)

我不知道该怎么读:

void (*signal(int sig, void (*func)(int))) (int);

我知道void (*func)(int)是一个指针,指向一个接受int并返回void的函数。
我的猜测是signal是一个接受int和void (*func)(int)的函数,它返回一个指针,指向一个接受int并返回void的函数(因此是另一个void (*func)(int))。我只是对这种用法有点困惑,还有this website不能正确翻译它的事实。

oug3syen

oug3syen1#

你的阅读是正确的。
signal函数有两个参数,intvoid (*)(int)(i.一个指针指向一个函数,该函数接受int并返回void),并返回void (*)(int)
对于cdecl,您需要删除参数名,以便它将其识别为声明。如果你传递这个:

void (*signal(int, void (*)(int))) (int);

它返回如下:
声明信号为函数(int,指针指向函数(int)返回void)返回指针指向函数(int)返回void
在处理函数指针时,使用typedef使代码更具可读性。实际上,signal的Linux手册页定义如下:

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

这比明确的版本要清楚得多。

相关问题