- 1、本文档共59页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第 13 章程序组织与编译预处理
第13章 程序组织与编译预处理
13.1 简介
严格地说,预处理命令(Preprocessing Directives )并非 C 语言语法的组成部分,它只
是对代码书写的一种约定和简化的表示方式。由于绝大多数 C 语言编译器都支持预处理功
能,所以 C 标准也对预处理功能做了明确的定义和统一的规定。
编译预处理,顾名思义,是在编译之前对源代码进行的处理工作。这些处理工作在源代
码中按照约定被写成预处理命令。
含有预处理命令的文本文件,即所谓源文件(Source Files ),也叫做预处理文件
(Preprocessing Files ),需要经过预处理程序“加工”“处理”之后才能形成编译器可以编译
的不含预处理命令的翻译单元(Translation Unit )。
C 语言源程序可以由多个源文件组成。在一定条件下,部分源文件可以形成独立的预处
理翻译单元(Preprocessing Translation Unit )单独进行预处理,单独编译。
从概念上来说,预处理与编译是两个独立的、一先一后进行的翻译源程序的过程,但在
许多开发环境中,并不特别地区分它们,以至于很难察觉预处理过程的存在。
源代码
编译器
预处理器
图13-1 预处理在编译前完成
预处理器对源代码所做的“加工”无非是一些“替换”、“添加”、“拼接”、“删除”之类
的工作。在代码使用预处理命令的目的是提高编程的效率、增强代码的可读性、可维护性、
可移植性、改善代码的结构、便于调试及有条理地管理源程序代码。
13.1.1 一般特点
每条预处理命令逻辑上都占一行。预处理命令都以“# ”开头。老式的 C 要求“# ”在
第一列,但现代的 C 语言预处理器容许“# ”所在行前面或后面有空白字符。
预处理不是一次性完成的,而是分为几个阶段逐步完成的。理解在预处理阶段预处理器
第 13 章程序组织与编译预处理
工作的过程,可以对初始的源代码究竟被加工处理成了什么样子有清楚的认识。
13.1.2 预处理的几个阶段
1. 首先进行的处理是把源文件中的不规范的字符替换为标准的 C 语言源字符。
比如,有的IDE 可能使用特殊的字符表示文本中的换行符,这些将被替换为标
准的源字符。
2. 删除换行字符
比如下面的代码
int ab\
c ;
将被改为
int abc ;
再比如
#define ABC 1234\
567
将被改写为
#define ABC 1234567
进行这样的处理,是因为预处理命令都是以行为单位的,只有先处理了这个问
题,预处理器才能更容易地识别出各条预处理命令。
3. 识别预处理单词1 (Preprocessing Tokens )并把注释部分替换为空格。
4. 开始执行预处理命令,进行宏展开,执行_Pragma (C99 )运算,如果遇到#include
预处理命令,则把相应的源文件包含进来,并对源文件反复做以上 1~4 步的预
处理,直到源文件中没有预处理命令。
5. 把字符常量或字符串字面量中的转义序列替换为对应的字符。
6. 连接相邻的字符串字面量。比如把代码中的“ ABC
文档评论(0)