解读C的声明,解析各种函数、指针组合的声明
来源:互联网 发布:linux下sleep()的用法 编辑:程序博客网 时间:2024/06/06 05:47
有时候阅读到一些复杂一点的声明时候总是一脸懵逼,比如下面这些
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的指针的函数的指针”。
- 解读C的声明,解析各种函数、指针组合的声明
- [C/C++]如何解读返回函数指针的函数声明
- [C/C++]如何解读返回函数指针的函数声明
- 解读C的声明
- 指针的概念、C指针声明解读之左右法则
- 指针的概念、C指针声明解读之左右法则
- 如何解读返回函数指针的函数声明
- 如何解读返回函数指针的函数声明
- 复杂指针的声明和解读
- 娓娓道来c指针 (4)解析c的声明语句
- 娓娓道来c指针 (4)解析c的声明语句
- 函数指针的声明方法
- 函数指针的复杂声明
- 如何解决C/C++返函数指针的函数声明
- C语言声明的解析
- C语言 声明的一般 解读 方法
- 理解复杂的C/C++声明 const, typedef , 函数指针
- 理解复杂的C/C++声明 const, typedef , 函数指针
- Hive学习笔记4@参数配置
- 在.NET Core控制台应用程序中使用强类型配置
- u-boot在nandflash中的启动原理
- 京京_两个div的模块关联查询与取消
- 实现开机自动启动oracle以及监听器
- 解读C的声明,解析各种函数、指针组合的声明
- Linux nc安装
- VueJs开发入门
- leetcode500 Fizz Buzz Java
- JS生成动态表格并为每个单元格添加单击事件的方法
- 【算法】bootstrap, boosting, bagging 几种方法的联系
- [P1330]封锁阳光大学
- 内部类
- U-boot中关于0xdeadbeef说明【目前最详细的】