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

  • 3
  • 0
  • 约4.53万字
  • 约 9页
  • 2017-08-06 发布于河南
  • 举报
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)

1亿VIP精品文档

相关文档