头文件包含命令 #include 的效果与直接复制粘贴头文件内容的效果是一样的,预处理器实际上也是这样做的,它会读取头文件的内容,然后输出到 #include 命令所在的位置。
头文件包含是一个递归(循环)的过程,如果被包含的头文件中还包含了其他的头文件,预处理器会继续将它们也包含进来;这个过程会一直持续下去,直到不再包含任何头文件,这与递归的过程颇为相似。
递归包含会导致一个问题,就是重复引入同一个源文件。例如在某个自定义头文件 xyz.h 中声明了一个 FILE 类型的指针,以使得所有的模块都能使用它,如下所示:
FILE 是在 stdio.h 中自定义的一个类型(本质上是一个结构体),要想使用它,必须包含 stdio.h,因此 xyz.h 中完整的代码应该是这样的:
现在假设程序的主模块 main.c 中需要使用 fp 变量和 printf() 函数,那么就需要同时引入 xyz.h 和 stdio.h: