C++ 第4章 预处理指令.doc

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C第4章预处理指令

第四章 预处理指令 熟悉预处理指令对阅读专业级的源代码(比如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与C++的兼容) 不过在C++里,预处理指令不如在C语言中那么重要,因为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代表“内联函数”,其语法为: 在函数声明前加 i

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档