版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、编译预处理:编译预处理:在源程序文件中,加入在源程序文件中,加入“编译预编译预处理命令处理命令”,使编译程序在对源程序进行通,使编译程序在对源程序进行通常的编译(包括词法分析、语法分析、代码常的编译(包括词法分析、语法分析、代码生成、代码优化)生成、代码优化)之前,先对这些命令进行之前,先对这些命令进行预处理,预处理,然后将预处理的结果和源程序一起然后将预处理的结果和源程序一起再进行通常的编译处理,以得到目标代码再进行通常的编译处理,以得到目标代码(OBJ文件)。文件)。vC提供的编译预处理命令提供的编译预处理命令v宏命令(宏命令(Macro)v文件包含命令(文件包含命令(include)v条
2、件编译命令条件编译命令v这些命令均这些命令均以以#开头开头,以区别于语句。,以区别于语句。v一、不带参数的宏一、不带参数的宏v一般形式:一般形式: #define 标识符标识符 字符串字符串v如:如: #define PI 3.1415926v作用:用标识符(称为作用:用标识符(称为“宏名宏名”)PI代替字符串代替字符串“3.1415926”。v在预编译时,将源程序中出现的宏名在预编译时,将源程序中出现的宏名PI替换为字符替换为字符串串“3.1415926”,这一替换过程称为这一替换过程称为“宏展开宏展开”。v#define:宏定义命令:宏定义命令v#undef:终止宏定义命令:终止宏定义命令
3、例例#define PI 3.1415926 main()float l,s,r,v; printf(input radius:);scanf(%f,&r); /* 输入圆的半径输入圆的半径 */l = 2.0*PI*r; /* 圆周长圆周长 */ s = PI*r*r; /* 圆面积圆面积 */v = 4.0/3.0*PI*r*r*r; /* 球体积球体积 */printf(l=%10.4fns=%10.4fnv=%10.4fn,l,s,v);v说明:v1、一般宏名用、一般宏名用大写字母大写字母表示。(变量名一般用小写字母)。表示。(变量名一般用小写字母)。v2、使用宏可以提高程序的
4、可读性和可移植性。如上述程序、使用宏可以提高程序的可读性和可移植性。如上述程序中,多处需要使用中,多处需要使用值,用宏名既便于修改又意义明确。值,用宏名既便于修改又意义明确。v3、宏定义是用宏名代替、宏定义是用宏名代替字符串字符串,宏扩展时仅作,宏扩展时仅作简单替换简单替换,不检查语法。语法检查在编译时进行。不检查语法。语法检查在编译时进行。v4、宏定义不是、宏定义不是C语句,后面不能有分号。如果加入分号,语句,后面不能有分号。如果加入分号,则连分号一起替换。则连分号一起替换。如:如:#define PI 3.1415926;area = P*r*r;在宏扩展后成为:在宏扩展后成为:area
5、= 3.1315926;*r*r;结果,在编译时出现语法错误。结果,在编译时出现语法错误。v5、通常把、通常把#define命令放在一个文件的开头,使其在命令放在一个文件的开头,使其在本文件全部有效。(本文件全部有效。(#define定义的宏仅在本文件有效,定义的宏仅在本文件有效,在其它文件中无效,这与全局变量不同)。在其它文件中无效,这与全局变量不同)。v6、宏定义终止命令、宏定义终止命令 #undef结束先前定义的宏名。结束先前定义的宏名。v#define G 9.8vmain()v v v#undef G /* 取消取消G的意义的意义 */vf1()v v7、宏定义中、宏定义中可以引用已
6、定义的宏名。可以引用已定义的宏名。v例例8.2 v#define R 3.0v#define PI 3.1415926v#deinfe L 2*PI*R v#define S PI*R*Rvmain()vvprintf(L=%fnS=%fn,L,S); vv8、对程序中、对程序中用双引号括起来的字符串,即使与宏名相用双引号括起来的字符串,即使与宏名相同,也不替换。同,也不替换。例如上例的例如上例的printf语句中,双引号括起语句中,双引号括起来来L和和S不被替换。不被替换。v二、带参数的宏二、带参数的宏v一般形式:一般形式:v#define 宏名(参数表)宏名(参数表) 字符串字符串v带参数
7、的宏在展开时,不是进行简单的字符串带参数的宏在展开时,不是进行简单的字符串替换,而是进行参数替换。例、替换,而是进行参数替换。例、v例例v#define PI 3.1415926v#define S(r) PI*r*rvmain()v float a, area;v a = 3.6;v area = S(a); v printf(r=%fnarea=%fn,a,area);vv说明:说明:v 带参数的宏展开时,用实参字符串替换形参字符串,带参数的宏展开时,用实参字符串替换形参字符串,注意可能发生的错误。比较好的办法是宏定义的形参注意可能发生的错误。比较好的办法是宏定义的形参加括号。加括号。ar
8、ea=3.1415926 a a,但不会置换,但不会置换a为为3.6v说明:说明:v对带参数的宏定义的置换展开是用对带参数的宏定义的置换展开是用“表达式表达式”对等对等的置换的置换“形参表形参表”中的参数。上例中的中的参数。上例中的“ ”是不会是不会被置换。被置换。v宏名与括号之间宏名与括号之间不得有空格不得有空格,因为宏名与表达式之,因为宏名与表达式之间的分隔符为空格。间的分隔符为空格。v如果用如果用 #define S (r) PI r r 的话,则被置换为的话,则被置换为 area=(r) PI r r (a)v宏展开宏展开并不进行值的传递,并不进行值的传递,即不求表达式的值,也即不求表
9、达式的值,也没有没有“返回值返回值”的概念。的概念。v宏宏不存在类型问题不存在类型问题,宏名无类型,参数也无类型,宏名无类型,参数也无类型,表达式可以是任何类型。表达式可以是任何类型。 定义带参数的宏,可以实现一些简单的函数功能。定义带参数的宏,可以实现一些简单的函数功能。v如:如:#define MAX(x,y) (x)(y)?(x) : (y) main( )int a, b, c, t ; t = MAX(a+b, c+d); 注:注:这里的这里的 t 展开后为展开后为 t = (a+b)(c+d)?(a+b):(c+d)如果第一行写成:如果第一行写成: #define MAX(x,y)
10、 xy ? x : y结果不同!结果不同!因为因为置换展开是用置换展开是用 “表达式表达式” 对等对等 的置换的置换 “形参表形参表” 中的中的参数参数v例例 返回多个值的宏定义。返回多个值的宏定义。v#define PI 3.1415926v#define CIRCLE(R,L,S,V) L=2*PI*R;S=PI*R*R;V=4/3*PI*R*R*Rvmain()v float r,l,s,v; /*半径、圆周长、圆面积、球体半径、圆周长、圆面积、球体积积 */vscanf(%f,&r);vCIRCLE(r,l,s,v); vprintf(r=%6.2f,l=%6.2f,s=%6.
11、2f,v=%6.2fn,r,l,s,v);v例例 输出格式定义为宏输出格式定义为宏#define PR printf#define NL n#define D %d #define D1 D NL#define D2 D D NL#define D3 D D D NL#define D4 D D D D NL#define S %smain() int a,b,c,d;char string = CHINA;a = 1; b = 2; c = 3; d = 4;PR(D1,a);PR(D2,a,b); PR(D3,a,b,c);PR(D4,a,b,c,d);PR(S,string);文件包含命
12、令的一般格式是:文件包含命令的一般格式是:#include “文件名文件名”作用:预处理时,把作用:预处理时,把“文件名文件名”指定的文件内容复制到本文件,指定的文件内容复制到本文件,再对合并后的文件进行编译。再对合并后的文件进行编译。在在file1.c文件中,有文件包含命令文件中,有文件包含命令#include file2.c,预处理时,预处理时,先把先把file2.c的内容复的内容复制到文件制到文件file1.c,再对,再对file1.c进行编译。进行编译。从理论上说,从理论上说,#include命令可以命令可以包含任何类型包含任何类型的文件,只要这些文件的内容被扩展后符合的文件,只要这些
13、文件的内容被扩展后符合C语言语法。语言语法。一般一般#include命令用于包含扩展名为命令用于包含扩展名为.h的的“头头文件文件”,如,如stdio.h、string.h、math.h。在。在这些文件中,一般定义符号常量、宏,或声这些文件中,一般定义符号常量、宏,或声明函数原型。明函数原型。程序员也可以把自己定义的符号常程序员也可以把自己定义的符号常量、宏,或函数原型放在头文件中,量、宏,或函数原型放在头文件中,用用#include命令包含这些头文件。命令包含这些头文件。(1)文件)文件print_format.h#define PR printf#define NL n#define D
14、%d #define D1 D NL#define D2 D D NL#define D3 D D D NL#define D4 D D D D NL#define S %s(2)文件)文件file1.c#include print_format.h“main() int a,b,c,d;char string = CHINA;a = 1; b = 2; c = 3; d = 4;PR(D1,a);PR(D2,a,b); PR(D3,a,b,c);PR(D4,a,b,c,d);PR(S,string);说明:说明:1、一个一个include命令命令只能指定一个只能指定一个被包含文件,如果被包含
15、文件,如果要包含要包含n个文件,用个文件,用n个个Include命令。命令。2、#include命令的文件名,可以使用两种括号。命令的文件名,可以使用两种括号。#include file2.h 先在引用被包含文件的目录查找先在引用被包含文件的目录查找file2.h文件,若没有,再到系统指定的目录查找。文件,若没有,再到系统指定的目录查找。 #include 仅在系统指定的目录查找文件仅在系统指定的目录查找文件file2.h。3、如果、如果“文件文件1”包含包含“文件文件2”,而,而“文件文件2”又包含又包含“文件文件3”,则可在,则可在 “文件文件1” 中使用中使用两个两个 include 命
16、命 令。令。4、文件包含可以嵌套。即一个被包含文件中、文件包含可以嵌套。即一个被包含文件中又可以包含另一个文件。又可以包含另一个文件。文件文件file1.c#include“file3.h”#include“file2.h”file3.h 应出现在应出现在 file2.h 之前之前文件文件file1.c#include“file2.h” 文件文件file2.c#include“file3.h” 9.3 条件编译1条件编译的语句形式:条件编译的语句形式:1) #ifdef 标识符标识符 程序段程序段1 #else 程序段程序段2 #endifv其作用是:如果其作用是:如果“标识符标识符”已定义,
17、则编译已定义,则编译“程序段程序段1”,否则编译,否则编译“程序段程序段2” 。v说明:1、“标识符标识符”一般为一般为#define命令所定义。命令所定义。2、其中的、其中的“程序段程序段1”或或“程序段程序段2”可以是命令,也可以是语可以是命令,也可以是语句或语句组。句或语句组。3、#else部分部分可有可无可有可无。4、所谓、所谓“标识符已定义标识符已定义”是无论是无论“标识符标识符”定义为什么内容。定义为什么内容。5、用条件编译的作用是缩短编译时间,减少目标程序的长度。、用条件编译的作用是缩短编译时间,减少目标程序的长度。例:例: #ifdef IBM_PC #define INTEG
18、ER_SIZE 16#else #define INTEGER_SIZE 32#endif2) #ifndef 标识符标识符程序段程序段1 #else程序段程序段2 #endif其作用是:如果其作用是:如果“标识符标识符”未定义,则编译未定义,则编译“程序段程序段1” , 否则编译否则编译“程序段程序段2”。3) #if 表达式表达式程序段程序段1 #else程序段程序段2 #endif其作用是:当其作用是:当“表达式表达式”值为非值为非0 ,则编译,则编译“程序段程序段1” , 否则编译否则编译“程序段程序段2”。#define LETTER 1main( ) char str20 = “C language”, c ; int i ; i = 0; while ( ( c = stri !=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年简历分析与视频面试AI评估的协同工作机制
- 护理安全案例分享
- 拉链制作工岗前基础能力考核试卷含答案
- 多晶硅后处理工岗前岗中考核试卷含答案
- 2026年新科教版高中高一数学上册第三单元指数对数函数综合卷含答案
- 有毒有害气体处理工岗前岗中水平考核试卷含答案
- 天然香料制备工班组建设竞赛考核试卷含答案
- 2026年新科教版高中高二化学下册第一单元反应热计算卷含答案
- 耐火成品发运工冲突管理强化考核试卷含答案
- 耐火炉窑装窑工岗前沟通协调考核试卷含答案
- 公司信息回复管理制度
- 两新党建笔试试题及答案
- 台球厅承包合同协议书
- 2024年吉林延边州州直事业单位招聘真题
- 2025《学前教育法》宣传月培训含讲稿
- 急诊科副高试题及答案
- 高处安全作业管理制度
- 特种设备安全管理制度汇编
- 酒店前厅接待礼仪培训
- 2025年泵站运行工(高级)职业技能鉴定参考试指导题库(含答案)
- SCR脱硝催化剂体积及反应器尺寸计算表
评论
0/150
提交评论