C++/C 顺时针法则

  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()函数进行分析:

  首先从signal这个名字开始,顺时针阅读,首先遇到(,那么判断signal是一个函数,其参数是int sig,和void (*func)(int)。而这个用同样手段分析func可得其是一个返回值为空的函数指针,其参数是一个int类型值。继续顺时针阅读,遇到*,所以判断signal返回值是一个指针。继续顺时针阅读,遇到(int),那么可以知道signal的返回值是一个接收int类型参数值的函数指针;继续往下,可以知道signal的返回值是一个返回值为空且接收int类型参数值的函数指针,然后最后遇到声明语句的结尾";"。综述,signal是接收两个类型参数,分别是int类型和一个接收int类型参数病返回值为空的函数指针func的函数,其返回值为一个返回值为空且接收int类型参数的函数指针。

 

By the way,博客园的编辑器用起来真不习惯。

posted @ 2017-10-22 13:28  byr_JZhong  阅读(526)  评论(0编辑  收藏  举报