在头文件的开头和结尾,我们经常看到这样的语句(以ctrl.h为例):
#ifndef _CTRL_H_
#define _CTRL_H_
...
...
#endif // end of _CTRL_H_ definition
其目的是防止头文件的“重复包含”,这里的“重复包含”是什么意思呢?
其实这里的“重复包含”是指被同一个文件“重复包含”,比如main.c中包含了ctrl.h和pid.h,但是ctrl.h中又包含了pid.h,这样,就可以避免pid.h在main.c中被“重复包含”。
对于不同的文件包含同一个头文件,比如main.c和ctrl.c中都包含了pid.h,在编译阶段,这两个编译单元都会分别包含pid.h的,即使他们使用了#ifndef…#define…#endif。这也是不建议在头文件中定义非inline函数和非static变量的原因,因为如果定义了这类函数或者变量,会造成“重定义”。
至于应该在头文件中定义inline函数的原因,在之前的博文中已经介绍过,不再赘述。而static变量具有文件作用域,仅在定义它们的文件内可见,假如pid.h中定义了static int refValue,而main.c和ctrl.c中都包含了pid.h,那么main.c和ctrl.c中使用的refValue是两个相互独立的refValue。《嵌入式系统高级C语言编程》一书指出:如果一个工程文件由很多人共同完成,这些文件又是各自编译的,这就难免使得某些人使用了一样的全局变量名,那么为了以后程序中各自的变量和函数互不干扰,就可以使用static修饰符,这样对链接到同一个程序的其他代码文件而言就是不可见的。