您的位置:首页 > 其它

解读C的声明,解析各种函数、指针组合的声明

2017-03-03 16:03 363 查看
有时候阅读到一些复杂一点的声明时候总是一脸懵逼,比如下面这些

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的指针的函数的指针”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息