C语言标准库有一个函数signal(),其声明让人大开眼界:void(*signal(int sig,void(*func)(int)))(int);
这种晦涩的声明实在让人难以理解,在网上搜索一番后,发现一个法则:The "Clockwise/Spiral Rule",姑且翻译为顺时针阅读法则吧,也可以翻译为螺旋阅读法则?
这个规则有三个简单的步骤:
1.首先从未知的成分开始,然后以顺时针方向进行移动,当遇到下述的成分将其替换成文字叙述:
a.[X]或者[] => 长度为X的数组或者未定义长度的数组
b.(type1, type2, ...) => 一个接受类型type1,type2,...等参数的函数
c.* => 指针
2.保持顺时针方向阅读直到所有内容被覆盖;
3.永远首先解析括号里面的内容。
举个例子,如下图:
+-------+
| +-+ |
| ^ | |
char *str[10];
^ ^ | |
| +---+ |,
+-----------+
首先从未知成分str开始:
str是...
- 我们从str开始顺时针阅读,首先遇到[,那么意味着str是一个数组,所以我们有:str是一个长度为10的数组;
- 继续顺时针阅读,我们这时候遇到了*,然后我们有:str是一个长度为10的指针数组;
- 继续顺时针阅读,我们这时候遇到;,认为已经到达了语句结尾,但是我们需要继续进行,跳过这一个元素;
- 这一步,我们遇到char,所以我们认为str是一个array 10 of pointers to char;
- 然后我们又遇到了:,并且我们已经覆盖了所有成分,因此结束整个过程。
根据以上这个例子,我们来对开始提到的signal()函数进行分析:
sig,和void (*func)(int)。而这个用同样手段分析func可得其是一个返回值为空的函数指针,其参数是一个int类型值。继续顺时针阅读,遇到*,所以判断signal返回值是一个指针。继续顺时针阅读,遇到(int),那么可以知道signal的返回值是一个接收int类型参数值的函数指针;继续往下,可以知道signal的返回值是一个返回值为空且接收int类型参数值的函数指针,然后最后遇到声明语句的结尾";"。综述,signal是接收两个类型参数,分别是int类型和一个接收int类型参数病返回值为空的函数指针func的函数,其返回值为一个返回值为空且接收int类型参数的函数指针。