【发布时间】:2021-12-12 03:55:08
【问题描述】:
那么有人可以解释一下这应该做什么:
void (*signal(int sig, void (*func)(int)) ) (int);
这是从标准信号库中获取的定义。
【问题讨论】:
那么有人可以解释一下这应该做什么:
void (*signal(int sig, void (*func)(int)) ) (int);
这是从标准信号库中获取的定义。
【问题讨论】:
函数signal 接受参数:
int sig - a signal value
void (*func)(int) - a pointer to a function that takes an int and returns void
然后返回:
void (*)(int) - a function that takes an int and returns void
signal注册一个函数,当信号发生时调用,并返回前一个函数处理程序。
【讨论】:
手册页通过引入typedef 使这个声明更容易理解:
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
sighandler_t 定义为指向接受int 并返回void 的函数的指针。
signal 是一个接受int(信号编号)和函数指针并返回函数指针的函数。
【讨论】:
基本上,它允许决定如何处理发送到您的程序的特定信号(由参数int sig 标识)。
void (*func)(int) 是指向将处理信号的函数的指针(您可以提供自定义函数或使用 SIG_DFL SIG_IGN 这是正常管理或忽略它的默认操作)。
函数signal 然后返回指向在调用此函数之前存在的处理程序的指针,否则SIG_ERR 发生错误。这可用于在您最近完成自定义行为后恢复默认处理程序。
【讨论】:
以名字开头:
signal
尽可能向右走:
signal(int sig, void (*func)(int))
您有一个带括号的参数列表,因此它是一个带有 2 个参数的函数:一个名为 sig 的 int 和一个名为 func 的函数指针(您可以稍后以相同的方式对其进行分析)。
然后你又碰到了一个右括号,所以你向左走:
*signal(int sig, void (*func)(int))
所以函数signal 返回一个指向...某物的指针。让我们去掉括号,再往右走,因为我们可以:
(*signal(int sig, void (*func)(int)) ) (int)
我们又得到了一个带括号的参数列表,所以signal 返回一个指向函数的指针,该函数将int 作为唯一的参数。然后再向左走:
void (*signal(int sig, void (*func)(int)) ) (int)
因此,函数 signal 返回指向函数的指针,该函数采用 int 并返回 void。
是的,这种语言很奇怪,但至少它是一致的。 :)
【讨论】: