C语言学习——预处理命令(“文件包含”处理)

9.2"文件包含"处理

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

#include"文件名"

或者

#include<文件名>

下图表示"文件包含"的含义。经过(1)(2)后,在编译时,对将经编译预处理的file2.c(如图(3))作为一个源文件单位进行编译。

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

将下面的格式宏做成头文件,把它包含在用户程序中。

cpp 复制代码
//将格式宏做成头文件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 D D NL
#define S "%s"
cpp 复制代码
//主文件 file1.c
#include<stdio.h>
#include"format.h"
​
int 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);
}
​
//输出:
1
12
123
1234
CHINA

注意:(看一下即可)

  • 在编译时开不是对两个文件分别进行编译,然后再将它们的目标程序连接的,而是在经过编译处理后将头文件 format. h包含到主文件中,得到一个新的源程序,然后对这个文件进行编译,得到一个目标(.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中定义:

cpp 复制代码
#include"file3.h"
#include"file2.h"

这样,file1和file2都可以用到file3的内容。在file2中不必再用#include"file3.h"了。

(3)在一个被包含文件中又可以包含另一个被包含文件,即文件包含是可以嵌套的。

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

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

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

声明:本文章为个人学习笔记,资料整理参考谭浩强《C程序设计(第三版)》如有错误,欢迎大家指正!

相关推荐
悠仁さん8 小时前
【C++】AVL 树
c++
wuminyu8 小时前
JVM规范学习总结:解释器与JIT编译器如何处理JVM字节码
java·linux·c语言·jvm·c++
小徐不徐说8 小时前
序列化与反序列化:把 C++ 对象可靠地保存下来
开发语言·数据库·c++·php
ragnwang9 小时前
Notes: Python pybind11 import C++ module
开发语言·c++·python
Wang's Blog9 小时前
Java 项目实战: 交友项目 - 搜索附近的功能概述和分析
java·开发语言·交友
骑着蜗牛撵大象3279 小时前
大模型 Agent 的沙箱护栏:gVisor 隔离、出口白名单与审计闭环
java·开发语言·jvm·安全·agent沙箱·gvisor·microvm
Dxy123931021610 小时前
JS DES 加密详解
开发语言·javascript·arcgis
充值内卷10 小时前
我给桌面加了个鱼缸:C++ 写后端,WebView2 里养一座 Three.js 小岛
开发语言·javascript·c++
云和数据.ChenGuang10 小时前
深入解析 Python 的 dir():从用法到 CPython 源码实现
开发语言·人工智能·python·langchain
nice_lcj52011 小时前
深入理解 Java 反射:从 Class 对象到方法调用(含性能实测 + 迷你 IOC 实战 + 面试考点)
java·开发语言·后端·面试