- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第四章 预处理指令
熟悉预处理指令对阅读专业级的源代码(比如linux)和实际编程中用到的库(比如MFC,WindowsAPI,DirectX)是很重要的。
预处理指令不是C/C++本身的组成部分,预处理指令在C/C++代码编译之前被处理,故称“预处理”。认识这一点对理解预处理也很重要。
C++继承了C的预处理指令,其常用的预处理指令分为三种(大多与C兼容)有:
文件包含:#include??????
宏定义: #define,?#undef
条件编译:#if?,#else,#elif(否则如果),#endif?
? #ifdef(或#if defined如果定义了一个符号, 就执行操作? #ifndef(或#if !defined如果没有定义一个符号, 就执行操作#line?(?重新定义当前行号和文件名#error(输出编译错误停止编译#pragma?提供机器专用的特性,同时保证与C++的兼容?一、文件包含 include”filename” 和includefilename,两者的区别在课件第一章已讨论过了。
二、宏定义
1 #define
#define PI 3.14
main ( )
{
float i=PI; //或float const i=PI;
}
上述程序怎么被编译器处理?
首先编译器对预处理指令#define PI 3.14进行宏替换(预处理),变成
main ( )
{
float i=3.14; //宏替换
}
然后编译它。也就是说宏定义只起到C/C++源程序的“占位符”作用。
Q1:#define PI 3.14与float const=3.14有什么区别?
答:前者是预处理指令,只起到C/C++源程序的“占位符”作用,并未指定类型。后者是C++语言成份,有严格的类型限制。前者不做类型正确性检查,不如后者严格,比如:
#define PI=3.1A //无法产生正常的宏替换
main ( )
{
float i=PI;
}
2 #undef
可以取消宏定义,比如
#define PI 3.14
main ( )
{
float i=PI;
}
。。。。。。
#undef PI //PI不再有效
3 带参数的宏定义
#define PI 3.14
#define S(r) PI*r*r //r是该宏的“形式参数”
main ( )
{
float area;
float a=3.6;
area=S(a); //宏替换为3.14*a*a,
}
带参数的宏定义很像函数,它在解决一些编程问题中非常有用。
Q2:有个C语言程序中,有几行代码被重复使用,按常识应把它写成函数,以便于“一次编码,重复使用”。但它对效率要求特别高,而函数调用又影响效率(要进行现场保护/恢复和很多栈操作)。怎么解决这个矛盾?
答:用宏定义定义该函数,可以做到“一次编码”,而宏定义在代码中只进行宏替换,产生的是嵌入的代码,并不产生函数调用,可以做到“重复使用,而又不影响效率”。举例:
i++; j++; k++; //这三行代码在程序中被反复使用,而且对效率要求极高
写成函数:
fun (int x, int y, int z) {x++; y++; z++;}
main ( ){
int i=1,j=1,k=1;
for( int kk=1, 100000, kk++) fun(i,j,k);
}
但调用函数影响效率。改写成:
#define S(a,b,c) {a++;b++;c++ ;}
main ( ){
int i=1,j=1,k=1;
for( int kk=1, 100000, kk++) S(i ,j,k) ; //宏替换不产生函数调用
}
解决了题目中的矛盾。
上面的例子只在一个点发生了宏替换,只是演示性的,实际意义不大。但多点使用,就很有实际意义了,可以做到“一次编码,重复使用,而又不影响效率”。在实际的C/C++库中和源代码中,用宏定义(代参数的或不带参数的)指代一段代码相当常见,常见到有些初学者怀疑那不是C/C++程序。
4 inline函数
前面演示了的宏定义“函数”及其实际使用价值,但是宏定义代换一些复杂表达式不太方便(谭浩强的课本中讲了括号表达式问题),C++增加了一个新的关键字inline。
inline是C++的关键字,而不是宏定义,inline代表“内联函数”,其语法为:
在函数声明前加 inline,其它与普通函数的声明一样。inline函数体的实现也与普通函数一样。
inline函数在编译时,产生嵌入式二进制代码(
您可能关注的文档
- ADDA的FPGA控制.doc
- Admqedl证券期货经营机构信息系统备份能力标准.doc
- ADSL常见故障分类及其处理方法.doc
- ADS中文教程第4章55-71.doc
- AD的备份和还原.doc
- Aesgkqu中央财经大学2012年经济学考研资料.doc
- AFC系统网络双机热备、均衡负载实现方案.doc
- Aix 5L 系统的备份与恢复 测试题.doc
- AIX_存储管理概念_AIX存储方面不可多得的好资料.doc
- AIX磁盘管理.doc
- 未来移动通信论坛:2025年低空经济场景应用与通信需求白皮书.docx
- 2025年设备更新优秀案例集-中国通信企业协会.docx
- 香港证交所上市公司多元包容指数(D&I+Index)研究报告与100强榜单 2025.docx
- T ITS 2025 自主式交通系统自动驾驶车辆驾驶员作业负荷度量方法.docx
- 植入性医疗器械实施细则.pdf
- 文旅元宇宙——人工智能与实体经济的战略融合发展机遇.docx
- 数字资产系列研究.docx
- 2025ESG评级:海南自由贸易港低碳建设的关键抓手与路径创新报告.docx
- 国资国企穿透式监管白皮书_第一版 [2025年8月].docx
- 产业园区智慧招商管理系统解决方案.docx
文档评论(0)