有时候阅读到一些复杂一点的声明时候总是一脸懵逼,比如下面这些
int atexit(void )(*func)(void);
void(*signal(int sig,void(*func)(int)))(int);
特别是搞linux的,阅读到一些内核代码往往如此,想要理解这些函数,往往先从读法开始,下面有一种方法和大家分享。
机械地向前读(好low)
步骤如下:
1、首先着眼于标识符(变量名或者函数名)。
2、从距离标识符最近的地方开始,依照优先顺序解释派生类型(指针,数组和函数)。
优先顺序说明如下,
①用于整理声明内容的括弧
②用于表示数组的[],用于表示函数的()
③用于表示指针的*
3、解释完成派生类型,使用’of‘、’to‘、’returning‘将他们连接起来。
4、最后,追加数据类型修饰符(在左边,int、double等即返回值)。
5、英语不好的人,可以倒序解释(就是用中文的思维)
比如
int(*func_p)(double);
①首先着眼于标识符:func_p
func_p is
②因为存在括号,这里着眼于:*
func_p is pointer to
③解释用于函数的(),参数是:double
func_p is pointer to function(double) returning
④最后,解释数据类型修饰符:int,即返回值
func_p is pointer to function(double) returning int
⑤中文就是
func_p 是指向返回int的函数的指针
无论多复杂的声明,按照这个顺序来,百试不爽
下面是各种各样的c语言声明
int *hoge[10];
hoge is array(元素个数10) of pointer to int
中文:hoge是指向int的指针的数组(元素个数10)
int (*hoge)[3];
hoge is pointer to array(元素个数3) of double
中文:hoge是指向int的数组(元素个数10)的指针
int func(int a);
func is function(参数为int a)returning int
中文:func是返回int的函数(参数是int a)
int (*func)(int a);
func is pointer to function(参数为int a)returning int
中文:func是指向返回int的函数(参数是int a)的指针
下面解释上面的两个声明
int atexit(void )(*func)(void)
atexit is function(func is pointer to function(void) returning void)returning int
解析为:
atexit 是返回int的函数(参数是,指向返回void 没有参数的函数的指针)。
这个是标准库的一个函数
void(*signal(int sig,void(*func)(int)))(int);
signal is function(sig is int,func is pointer to function(int)returning void) returning pointer to function(int) returning void
解析为:
signal 是返回“指向返回void参数为int的函数的指针”的函数,它有两个参数,一个是int,另一个是“指向返回void参数为int的指针的函数的指针”。