1.功能:一个源文件可将另一个源文件的内容全部包含进来
2.一般形式: #include “文件名”
或 #include <文件名>
区别:
用尖括号时,编译器从C标准库文件所在的目录中寻找要包含的文件,这称为标准方式;
用双撇号时,系统先在用户当前目录中寻找要包含的文件,若找不到,再按标准方式查找。
3.被包含文件内容
源文件(*.c)
头文件(*.h)
4.说明
1)一个#include命令只能指定一个被包含文件,如果要包含n个文件,要用n个#include命令;
2)如果文件1包含文件2,而文件2中要用到文件3的内容,则可在file1.c中定义:
#include \"file3.h\"
#include \"file2.h\"
3)文件包含可以嵌套;
4)被包含文件与其所在的文件,在预编译后已成为同一个文件,因此,如果file2.h中有全局变量,它也在file2.c文件中有效,不必用extern声明。
特别注意:
由于嵌套包含文件的原因一个头文件可能会被多次包含在一个源文件中条件指示符可防止这种头文件的重复处理。
例如:
#ifndef BOOKSTORE_H
#define BOOKSTORE_H
/* Bookstore.h 的内容 */
#endif
条件指示符#ifndef 检查BOOKSTORE_H 在前面是否已经被定义,这里BOOKSTORE_H是一个预编译器常量习惯上预编译器常量往往被写成大写字母,如BOOKSTORE_H在前面没有被定义则条件指示符的值为真于是从#ifndef 到#endif 之间的所有语句都被包含进来进行处理。相反,如果#ifndef 指示符的值为假则它与#endif 指示符之间的行将被忽略,为了保证头文件只被处理一次,把如下#define 指示符
#define BOOKSTORE_H
放在#ifndef 后面这样在头文件的内容第一次被处理时BOOKSTORE_H 将被定义,从而防止了在程序文本文件中以后#ifndef 指示符的值为真。
只要不存在两个必须包含的头文件要检查一个同名的预处理器常量这样的情形,这个策略就能够很好地运作。#ifdef 指示符常被用来判断一个预处理器常量是否已被定义以便有条件地包含程序代码。
#ifdef 除了用于防止重复包含,还可以用于针对不同环境的条件编译。经常出现的有
#if defined (__GCC__) ¦ ¦ defined (__SUN_C__)
之类的指令,就是针对不同编译器、平台进行选择编译的预处理指令。当编译环境没有定义这个特定的符号的时候,则预处理器会自动忽略这一部分的代码。除了用 #ifdef 判断符号是否定义,还可以判断符号的值。VC 中常见的将 MSC_VER 与特定值比较以判断 VC 的版本的做法就是这个道理。 [Page]
除了以上提到的一些内容,还有一些相对少见的预处理器指令,如 #pragma。它们分别提供了一些特殊的优化手段和编译器控制方法,可以显著提高代码质量减轻编码负担,但是很多时候使用这些编译指令可能是不兼容于其他编译环境的,因此在项目中选用非标准预处理指令的时候,应该在可移植性和编码的优势中进行衡量后作决定。