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
#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 的版本的做法就是这个道理。
除了以上提到的一些内容,还有一些相对少见的预处理器指令,如 #pragma 。它们分别提供了一些特殊的优化手段和编译器控制方法,可以显著提高代码质量减轻编码负担,但是很多时候使用这些编译指令可能是不兼容于其他编译环境的,因此在项目中选用非标准预处理指令的时候,应该在可移植性和编码的优势中进行衡量后作决定。
文件包含是指一个C语言源程序中将另一个C语言源程序包含进来,通过include预处理指令实现。
一般形式:
#include”被包含文件名”
或#include<被包含文件名>
作用:将指定文件包含在当前文件中,插入至文件包含指令相应位置处。使用文件包含指令,可以减少程序设计人员的重复劳动,提高程序开发效率。
说明:
(1)被包含的文件一般指定为头文件(*.h),也可为C程序等文件
(2)一个include指令只能指定一个被包含文件,如果要包含n个文件,则要用到n条include指令。
(3)不能包含OBJ文件。文件包含是在编译前进行处理,不是在连接时进行处理。
(4)当文件名用双引号括起来时,系统先在当前目录中寻找包含的文件,若找不到,再在系统指定的标准方式检索其它目录。而用尖括号时,系统直接按指定的标准方式检索。
一般系统提供的头文件,用尖括号。自定义的文件,用双引号。
(5)被包含文件与当前文件,在预编译后变成同一个文件,而非两个文件。
(6)文件包含可以嵌套,但必须按顺序包含。