《Linux4.0设备驱动开发详解》笔记--第三章:Linux下的C编程特点
来源:互联网 发布:知的笔顺怎么写呀 编辑:程序博客网 时间:2024/05/17 22:26
3.1 Linux编码风格
- 参考文章:Documentation/CodingStyle
- 缩进用TAB
- {}使用:
- 对于结构体、if、for、while以及switch语句,“{”不另起一行
- 如果if、for循环后只有1行,不要加“{”和“}”
- if和else混合用的时候,else语句不另起一行
- 对于函数,“{”另起一行
- switch和case对齐
3.2 GNU C与ANSI C
- 零长度和变量长度数组
struct var_data { int len; char data[0]};int main(int argc, char *argv[]){ int i, n = argc; double x[n]; for(i=0; i<n; i++) x[i] = i; return 0;}
- case范围:支持case x … y这样的语法,区间[x,y]中的数都会满足这个case条件
- 语句表达式:包含在括号里的语句看成一个表达式,它可以出现在任何允许表达式的地方。
- typeof关键字:其可以获得x的类型,因此可以借助typedef来定义min这个宏
#define min(x,y) ({ const typeof(x) _x = (x); \ const typeof(y) _y = (y); \ (void) (&_x == &_y); \ _x < _y ? _x : _y; \})
- 可变参数宏,标准C就支持可变参数函数,意味着函数的参数是不固定的,如printf()函数,GNU C 中宏也可以接受可变参数目的参数,如
#define pr_debug(fmt,arg...) \ printf(fmt,##arg)
这里的arg表示其余的参数,可以是零个或多个,##是为了处理arg不代表任何参数的情况,这时候前面的逗号就显得多余了,使用##之后,CNU C 就会预处理会丢掉前面的逗号,这样
pr_debug("success!\n");扩展为:printk("success!\n");
- 标号元素:允许数组和结构体的元素初始化的顺序任意顺序出现。
数组初始化方式为在初始化值前添加”[INDEX]=”,或者用”[FIRST … LAST]=”的形式指定一个范围。
unsigned char data[MAX] = {[0 ... MAX] = 0};
结构体初始化方式
struct file_operations ext2_file_operation = { .llseek = generic_file_llseek, .read = generic_file_read, ...};
- 当前函数名:FUNCTION或者func保存当前函数的名字
- 特殊属性声明:GUN C允许申明函数、变量和类型的特殊属性,以便手动优化和定制代码检查的方法,申明方法:在申明后加上attribute((ATTRIBUTE)). ATTRIBUTE为属性说明,若存在多个则逗号隔开。
- 内建函数:不属于标准库的内建函数通常以__builtin开始
- do{} while语句:其主要用于宏定义中,为了保证宏定义的使用者不会出现编译错误,他不对其他使用则做任何假设。
- goto语句:一般只限于错误处理中
0 0
- 《Linux4.0设备驱动开发详解》笔记--第三章:Linux下的C编程特点
- 《Linux4.0设备驱动开发详解》笔记--第十二章:Linux设备驱动的软件架构思想
- 《Linux4.0设备驱动开发详解》笔记--第二十一章:Linux设备驱动的调试
- 《Linux4.0设备驱动开发详解》笔记--第二章:Linux内核及内核编程
- 《Linux4.0设备驱动开发详解》笔记--第六章:Linux字符设备驱动
- 《Linux4.0设备驱动开发详解》笔记--第十章:Linux设备驱动中的中断与时钟
- 《Linux4.0设备驱动开发详解》笔记--第十三章:Linux块设备驱动
- 《Linux4.0设备驱动开发详解》笔记--第十五章:Linux I2C核心、总线与设备驱动
- 《Linux4.0设备驱动开发详解》笔记--第八章:linux设备驱动的阻塞与非阻塞
- 《Linux4.0设备驱动开发详解》笔记--第五章:Linux文件系统与设备文件
- 《Linux4.0设备驱动开发详解》笔记--第七章:Linux设备中的并发控制
- 《Linux4.0设备驱动开发详解》笔记--第十八章:ARM Linux设备树
- 《Linux4.0设备驱动开发详解》笔记--第十四章:Linux网络设备驱动
- 《Linux4.0设备驱动开发详解》笔记--第二十章:Linux芯片级移植及底层驱动
- 《Linux4.0设备驱动开发详解》笔记--第十九章:Linux电源管理的系统架构和驱动
- 《Linux4.0设备驱动开发详解》笔记--第四章:Linux内核模块
- 《Linux4.0设备驱动开发详解》笔记--第一章:Linux设备驱动概念及基础
- 《Linux4.0设备驱动开发详解》笔记--第十六章:USB主机、设备与Gadget驱动
- hdu 1878
- bzoj3575: [Hnoi2014]道路堵塞
- 杭电1509
- 集成友盟分享 分享成功后iOS8回调方法正常 iOS9没有回调
- HDU 1044 bfs+dfs
- 《Linux4.0设备驱动开发详解》笔记--第三章:Linux下的C编程特点
- js中的this关键字详解
- iOS设计规范
- 定义长方体类,数据成员有长、宽、高,成员函数有带默认形参值的构造函数(默认长宽高分别为2.5、3.4、2)、计算体积函数,分别构造默认对象和长宽高分别为6.25、4.8、5.2的对象,输出各对象的体积
- HDU 4177 Avoiding a disaster
- 大型网站架构系列:负载均衡详解(上)
- Unity3D-NavMesh导航网格寻路
- 素数判断
- bzoj 3931(spfa+最大流)