宏定义-“文件包含”处理

所谓“文件包含”处理是指一个源文件可以将另外一个源文件的全部内容包含进来,即将另外的文件包含到本文件之中。C语言提供了#include命令用来实现“文件包含”的操作。其一般形式为

# include"文件名"

#include <文件名>

                                        图 9.2

图9.2表示“文件包含”的含意。图9.2(a)为文件file1.c,它有一个#include <file2.c>命令,然后还有其他内容(以A表示)。图9.2(b)为另一文件file2.c,文件内容以B表示,在编译预处理时,要对#include命令进行“文件包含”处理:将file2.c的全部内容复制插入到#include<file2.c>命令处,即file2.c被包含到file1.c中,得到图9.2(c)所示的结果。在编译中,将“包含”以后的file1.c(即图9.2(c)所示)作为一个源文件单位进行编译。

“文件包含”命令是很有用的,它可以节省程序设计人员的重复劳动。例如,某一单位的人员往往使用一组固定的符号常量(如g=9.81,pi=3.1415926,e=2.718,c=…),可以把这些宏定义命令组成一个文件,然后各人都可以用#include命令将这些符号常量包含到自己所写的源文件中。这样每个人就可以不必重复定义这些符号常量。相当于工业上的标准零件,拿来就用。

例9.6可以将例 9.5程序改为:

  1. 文件format.h

#define PR printf

#define NL"\n"

#define D "%d"

#define D1 D NL

#define D2 D D NL

#define D3 D D D NL

# define D4 D D DDNL

#define S "%s"

  1. 文件file1.c

#include "format. h"

main ()

{int a.b,c,d;

char string[]="CHINA";

a=1;b=2;c=3;d=4;

PR(D1,a);

PR(D2.a,b);

PR(D3,a,b,c);

PR(D4,a.b,c.d);

PR(S,string);

}

注意:在编译时并不是作为两个文件进行连接的,而是作为一个源程序编译,得到一个目标(.obj)文件。因此被包含的文件也应该是源文件而不应该是目标文件。

这种常用在文件头部的被包含的文件称为“标题文件”或“头部文件”,常以“.h”为后(h为 head(头)的缩写),如“format.h”文件。当然不用“.h”为后缀,而用“.c”为后缀或者没有后缀也是可以的,但用“.h”作后缀更能表示此文件的性质。

如果需要修改一些常数,不必修改每个程序,只需修改一个文件(头部文件)即可。但是应当注意,被包含文件修改后,凡包含此文件的所有文件都要全部重新编译。

头文件除了可以包括函数原型和宏定义外,也可以包括结构体类型定义和全局变量定义等。说明:

(1)一个#include命令只能指定一个被包含文件,如果要包含n个文件,要用n个#include 命令。

(2)如果文件1包含文件2,而文件2中要用到文件3的内容,则可在文件1中用两个 include 命令分别包含文件2和文件3,而且文件3应出现在文件2之前,即在file1.c中定义:

#include "file3. h"

#include "file2.h"

这样,file1 和 file2都可以用file3的内容。在file2中不必再用#include <file3.h> 了(以上是假设file2.h在本程序中只被file1.c包含,而不出现在其他场合)。

(3)在一个被包含文件中又可以包含另一个被包含文件,即文件包含是可以嵌套的.例如,上面的问题也可以这样处理,见图9.3。

它的作用与图9.4所示相同。

                                图 9.3

                                   图 9.4

(4)在#include 命令中,文件名可以用双撇号或尖括号括起来,如可以在file1.c中用

# include <file2.h>或

# include "file2.h"

都是合法的。二者的区别是用尖括弧(即<file2.h>形式)时,系统到存放C库函数头文件所在的目录中寻找要包含的文件,这称为标准方式。用双撇号(即"file2.h"形式)时,系统先在用户当前目录中寻找要包含的文件,若找不到,再按标准方式查找(即再按尖括号的方式查找)。一般说,如果为调用库函数而用#include命令来包含相关的头文件,则用尖括号,以节省查找时间。如果要包含的是用户自己编写的文件(这种文件一般都在当前目录中),一般用双撇号。若文件不在当前目录中,双撇号内可给出文件路径。

(5)被包含文件(file2.h)与其所在的文件(即用#include命令的源文件filel.c),在预编译后已成为同一个文件(而不是两个文件)。因此,如果file2.h中有全局静态变量,它也在file1.c文件中有效,不必用extern声明。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳光向日葵之沈阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值