- 1、本文档共9页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)