- 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
您可能关注的文档
最近下载
- 温度控制参数确定、温度控制方法及相关设备.pdf VIP
- 人教PEP小学英语六年级上册单元测试卷(含答案+听力材料)全册.doc VIP
- 2025年湖南交通职业技术学院单招职业技能测试题库往年题考.docx VIP
- 2026春三年级下册数学核心素养教案(人教版 含课后反思).docx VIP
- 年产20万吨合成氨造气工段工艺设计毕业论文(可编辑)精编.doc VIP
- 英剧剧本唐顿庄园台词本中英文对照精排版第一季第一集.pdf VIP
- 300T汽车吊性能说明书-XCA300_1全地面起重机技术规格书+[主臂风电臂加超起].pptx VIP
- 3套新版人教版小学数学六年级上册期末必备综合试卷(含答案解析).pdf
- 面向激光增材制造的轻量化设计及适航分析.pdf VIP
- 2022年浙江省金华市中考数学试卷和答案.pdf VIP
原创力文档

文档评论(0)