嵌入式C语言自我修养01:Linux内核中C的语言语

  

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语言编程的一些语法惯例,比如:

嵌入式C语言自我修养01:Linux内核中C的语言语