1.1 Linux内核驱动中的奇怪语法
大家在看一些GNU开源软件,或者阅读Linux内核,驱动源码时会发现,在Linux内核源码中,有大量的C程序看起来“怪怪的”。说它是C语言吧,貌似又跟教材中的写法不太一样,说它不是C语言呢,但是这些程序确确实实是在一个C文件中。此时,你肯定怀疑你看到的是一个“假的C语言”!
比如,下面的宏定义:
<代码> # define mult_frac (x,号码,分母项)(\ {\ typeof (x)”=(x)/(分母项);\ typeof (x) rem=(x) %(分母项);\ (“*(号码))+ ((rem *(号码))/(分母项);\ }\ ) #定义ftrace_vprintk (fmt vargs) \ 做{\ 如果(__builtin_constant_p (fmt)) {\ 静态const char * trace_printk_fmt __used \ __attribute__((部分(“__trace_printk_fmt”)))=\ __builtin_constant_p (fmt) ?fmt:空;\ \ __ftrace_vbprintk (_THIS_IP_ trace_printk_fmt vargs);\ 其他}\ __ftrace_vprintk (_THIS_IP_ fmt, vargs);\ },(0)代码>
字符驱动的填充:
<代码>静态常量struct file_operations lowpan_control_fops={ .open=lowpan_control_open, .read=seq_read, .write=lowpan_control_write, .llseek=seq_lseek, .release=single_release, };代码>
内核中实现打印功能的宏定义:
<代码> # define pr_info (fmt,…) __pr (__pr_info fmt, # # __VA_ARGS__) #定义pr_debug (fmt,…) __pr (__pr_debug fmt, # # __VA_ARGS__) 代码>
你没有看错,这些其实也是C语言,但并不是标准的C语言语法,而是我们Linux内核使用的GNU C编译器扩展的一些C语言语法。这些语法在C语言教材或资料中一般不会提及,所以你才会似曾相识而又感到陌生,看起来感觉“怪怪的”。我们在做Linux驱动开发,或者阅读Linux内核源码过程中,会经常遇到这些“稀奇古怪”的用法,如果不去了解这些特殊语法的具体含义,可能就对代码的理解造成一定障碍。
本教程,就是带领大家一起去了解Linux内核或者GNU开源软件中,常用的一些C语言特殊语法扩展,扫除阅读Linux内核或GNU开源软件时,这些扩展特性带给我们的语法阅读障碍和困惑。
1.2 C语言标准和编译器
在进入正式课程之前,先给大家普及一下C标准的概念。在学习C语言时,大家在教材或资料上,或多或少可能见到过“ANSI C”的字眼。可能当时没有太在意,其实“ANSI C”表示的就是C语言标准。
什么是C语言标准呢?我们生活的现实世界,就是由各种标准构成的,正是这些标准,我们的社会才会有条不紊的运行。比如我们过马路,遵循的交通规则就是一个标准:红灯停,绿灯行,黄灯亮了等一等。当行人和司机都遵循这个默认的标准时,我们的交通系统才会顺畅运行。电脑中的USB接口也是一种标准,当大家生产的USB产品都遵循USB协议这种通信标准时,我们的手机、U盘、USB摄像头,USB网卡才可以在各种电脑设备上互插互拔.2G, 3 g, 4 g也是一种标准,当不同厂家生产的基带芯片都遵循这种通信标准,我们所用的不同品牌,不同操作系统的手机才可能互相打电话,互相发微信,互相给对方点赞。
同样,C语言也有它自己的标准。我们知道,C语言程序需要通过编译器,编译生成二进制指令,才能在我们的电脑上运行。在C语言刚发布的早期,各大编译器厂商开发自己的编译器时,各自开发,各自维护,时间久了,就会变得比较混乱。这就会造成这样一种局面:程序员写的程序,在一个编译器上编译通过,在另一个编译器编译通不过。大家按各自的习惯来,谁也不服谁,就像春秋战国时代:不同的货币,不同的度量衡,不同的文字,都是中国人,因为标准不统一,所以交流起来很麻烦,这样下去也不是办法啊。
后来ANSI(美国国家标准协会:美国国家标准协会,简称ANSI)出山了,联合ISO(国际化标准组织)召集各个编译器厂商大佬,各种技术团体,一起喝个茶,开个碰头会,开始启动C语言的标准化工作。期间各种大佬之间也是矛盾重重,充满各种争议,但功夫不负有心人,经过艰难的磋商,终于在1989年达成一致,发布了C语言标准,后来第二年又做了一些改进。于是,就像秦始皇统一六国,统一文字和度量衡一样,C语言标准终于问世了!因为是在1989年发布的,所以人们一般称其为C89或人私下偷偷收藏盒式标准,或者叫做ANSI C .
1.3 C标准内容
C标准里主要讲了什么?
C标准英文文档,洋洋洒洒几百页,讲了很多东西,但总体归纳起来,主要就是C语言编程的一些语法惯例,比如: