- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C语言条件编译及编译预处理阶段
一、C语言由源代码生成的各阶段如下:
C源程序-编译预处理-编译-优化程序-汇编程序-链接程序-可执行文件
其中 编译预处理阶段,读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理。或者说是扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。预处理过程先于编译器对源代码进行处理。
在C 语言中,并没有任何内在的机制来完成如下一些功能:在编译时包含其他源文件、定义宏、根据条件决定编译时是否包含某些代码。要完成这些工作,就需要使用预处理程序。尽管在目前绝大多数编译器都包含了预处理程序,但通常认为它们是独立于编译器的。预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行响应的转换。预处理过程还会删除程序中的注释和多余的空白字符。
二、伪指令(或预处理指令)定义
预处理指令是以#号开头的代码行。#号必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。下面是部分预处理指令:
指令 用途 # 空指令,无任何效果 #include 包含一个源代码文件 #define 定义宏 #undef 取消已定义的宏 #if 如果给定条件为真,则编译下面代码 #ifdef 如果宏已经定义,则编译下面代码 #ifndef 如果宏没有定义,则编译下面代码 #elif 如果前面的#if给定条件不为真,当前条件为真,则编译下面代码,其实就是elseif的简写 #endif 结束一个#if……#else条件编译块 #error 停止编译并显示错误信息 三、预处理指令主要包括以下四个方面:
1、宏定义指令
宏定义了一个代表特定内容的标识符。预处理过程会把源代码中出现的宏标识符替换成宏定义时的值。宏最常见的用法是定义代表某个值的全局符号。宏的第二种用 法是定义带参数的宏(宏函数),这样的宏可以象函数一样被调用,但它是在调用语句处展开宏,并用调用时的实际参数来代替定义中的形式参数。
1.1 #define指令1.1.1 #define预处理指令用来定义宏。该指令最简单的格式是:声明一个标识符,给出这个标识符代表的代码(比如像圆周率这样的数)。在后面的源代码中,我们就可以使用定义的宏取代要使用的代码,举例如下:
//例1#define MAX_NUM 10int array[MAX_NUM];for(i=0;iMAX_NUM;i++)
在这个例子中,对于阅读该程序的人来说,符号MAX_NUM就有特定的含义,它代表的值给出了数组所能容纳的最大元素数目。程序中可以多次使用这个值。作为一种约定,习惯上总是全部用大写字母来定义宏,这样易于把程序的宏标识符和一般变量标识符区别开来。如果想要改变数组的大小,只需要更改宏定义并重新编译程序即可。
1.1.2 使用宏的好处有两点:
一是使用方便。如下:
//例2#define PAI 3.1415926
PAI显然比3.1415926写着方便。
二是定义的宏有了意义,可读性强。如例1,MAX_NUM,望文生意便知是最大数量的意思,比单纯使用10这个数字可读性要强的多。
三是容易修改。如例1,如果在程序中有几十次会使用到MAX_NUM,修改只需要在宏定义里面修改一次就可以,否则你会修改到崩溃。
1.1.3 宏表示的值可以是一个常量表达式,允许宏嵌套(必须在前面已定义)。例如:
//例3#define ONE 1#define TWO 2#define SUM(ONE+TWO)
这里需要注意两点:一是注意上面的宏定义使用了括号。尽管它们并不是必须的。但出于谨慎考虑,还是应该加上括号的。例如:
six=THREE*TWO;
预处理过程把上面的一行代码转换成:six=(ONE+TWO)*TWO;
如果没有那个括号,就转换成six=ONE+TWO*TWO;了。
也就是说预处理仅是简单的字符替换,要时刻注意这一点,很多错误都会因此出现。
二是虽然我们举例用了#define ONE 1 这个例子,但是一般要求宏定义要有其实际意义,#define ONE 1这种没意义的宏定义是不推荐的。(大概是这么个意思,忘记具体怎么说了)
1.1.4 宏还可以代表一个字符串常量,例如:#define VERSION Version 1.0 Copyright(c) 2003
1.2 带参数的#define指令(宏函数)带参数的宏和函数调用看起来有些相似。看一个例子:
//例4#define Cube(x) (x)*(x)*(x)
可以时任何数字
您可能关注的文档
- 房地产价格制定和推盘策略汇报.ppt
- CPU及编译器概论.pdf
- Cre_lox位点特异性重组系统在高等真核生物中研究进展.pdf
- 房建施工之二模板施工技术及管理.ppt
- 废弃物识别及存放要求.pptx
- CREO2.0教程-第4篇-基础实体特征的建立.ppt
- 夫妻_忠实协议_一个不应成为问题法律话题_省略_干问题解释_三_征求意见稿_.pdf
- CRH2及CRH5动车组通信网络结构比较.pdf
- 改进的粒子群优化算法在分布式电源选址与定容中的应用.pdf
- CRM5.7系统IE设置工具以及系统插件安装程序使用说明.doc
- GB/T 32151.38-2024温室气体排放核算与报告要求 第38 部分:水泥制品生产企业.pdf
- 中国国家标准 GB/T 32151.38-2024温室气体排放核算与报告要求 第38 部分:水泥制品生产企业.pdf
- 《GB/T 22069-2024燃气发动机驱动空调(热泵)机组》.pdf
- GB/T 22069-2024燃气发动机驱动空调(热泵)机组.pdf
- 中国国家标准 GB/T 22069-2024燃气发动机驱动空调(热泵)机组.pdf
- 中国国家标准 GB/T 11064.1-2024碳酸锂、单水氢氧化锂、氯化锂化学分析方法 第1部分: 碳酸锂含量的测定 滴定法.pdf
- GB/T 11064.1-2024碳酸锂、单水氢氧化锂、氯化锂化学分析方法 第1部分: 碳酸锂含量的测定 滴定法.pdf
- 《GB/T 11064.1-2024碳酸锂、单水氢氧化锂、氯化锂化学分析方法 第1部分: 碳酸锂含量的测定 滴定法》.pdf
- GB/T 1148-2024内燃机 铝活塞.pdf
- 中国国家标准 GB/T 1148-2024内燃机 铝活塞.pdf
文档评论(0)