解释 void (*signal(int signo, void *(func)(int)))(int): 这是一个函数声明,它接受两个参数:一个整数类型的信号编号和一个指向以整数为参数并返回指针的函数的指针。该函数返回一个指向以整数为参数并返回空类型的函数指针。

5
请解释这个类型签名:void (*signal(int signo, void *(*func)(int)))(int)

这个 (int) 是什么意思? - shadyabhi
为什么我的问题被踩了? - shadyabhi
语法错误:http://www.cdecl.org/ 实际声明是什么? - Nick Presta
你应该在问题正文中提出问题,而不是标题。在标题中提出问题会让人感到奇怪:“请解释这个函数参数”。 - Alok Singhal
哪个函数参数?您正在展示一个带有两个参数的函数声明。您想要解释哪一个? - William Pursell
2个回答

17

当为传递的函数指针使用typedef时,signal函数的类型签名会更加清晰明了:

typedef void (*sighandler_t)(int);
sighandler_t signal(int signo, sighandler_t func);

sighandler_t是一个指向函数的指针,该函数接受一个int参数并返回无值。 signal函数需要这样一个函数指针作为它的第二个参数,并返回该类型的函数指针。


1

C语言声明需要从内向外阅读。对于复杂的函数声明,最棘手的部分是找出最内层的声明符(从哪里开始)。通常情况下,第一个不是类型标识符的标识符就是最内层的声明符。所以在这种情况下:

void (*signal(int signo, void *(func)(int)))(int)

声明符是 signal。在括号内,后缀比前缀优先级高,因此 signal 是一个函数,它有两个参数((int signo, void *(func)(int)) 部分),返回一个指向函数的指针(前缀 *),该函数接受一个 int 参数(结尾处的 (int)),并返回 void

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接