编译预处理在源程序文件中,加入编译预处理命令,使编译程序_第1页
编译预处理在源程序文件中,加入编译预处理命令,使编译程序_第2页
编译预处理在源程序文件中,加入编译预处理命令,使编译程序_第3页
编译预处理在源程序文件中,加入编译预处理命令,使编译程序_第4页
编译预处理在源程序文件中,加入编译预处理命令,使编译程序_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 编译预处理:编译预处理:在源程序文件中,加入在源程序文件中,加入“编译预处理命编译预处理命令令”,使编译程序在对源程序进行通常的编译(包括,使编译程序在对源程序进行通常的编译(包括词法分析、语法分析、代码生成、代码优化)之前,词法分析、语法分析、代码生成、代码优化)之前,先对这些命令进行预处理,然后将预处理的结果和源先对这些命令进行预处理,然后将预处理的结果和源程序一起再进行通常的编译处理,以得到目标代码程序一起再进行通常的编译处理,以得到目标代码(OBJ文件)。文件)。 C提供的编译预处理命令提供的编译预处理命令 宏命令(宏命令(Macro) 文件包含命令(文件包含命令(include)

2、条件编译命令条件编译命令 这些命令均以这些命令均以#开头,以区别于语句。开头,以区别于语句。一、不带参数的宏一、不带参数的宏一般形式:一般形式: #define 标识符标识符 字符串字符串如:如: #define PI 3.1415926作用:用标识符(称为作用:用标识符(称为“宏名宏名”)PI代替字符串代替字符串“3.1415926”。在预编译时,将源程序中出现的宏名在预编译时,将源程序中出现的宏名PI替换为字符串替换为字符串“3.1415926”,这一替换过程称为这一替换过程称为“宏展开宏展开”。#define:宏定义命令:宏定义命令#undef:终止宏定义命令:终止宏定义命令例例PI 3

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);关于宏定义的说明:关于宏定义的说明:1、一般宏名用大写字母表示。(变量名一般用小写字母)。、一般宏名用大写字母表示。(变量名一般用小写字母)。2、使用宏可以提高程序的可读

4、性和可移植性。如上述程序中,多处、使用宏可以提高程序的可读性和可移植性。如上述程序中,多处需要使用需要使用值,用宏名既便于修改又意义明确。值,用宏名既便于修改又意义明确。3、宏定义是用宏名代替、宏定义是用宏名代替字符串字符串,宏扩展时仅作简单替换,不检查语,宏扩展时仅作简单替换,不检查语法。语法检查在编译时进行。法。语法检查在编译时进行。4、宏定义不是、宏定义不是C语句,后面不能有分号。如果加入分号,则连分号语句,后面不能有分号。如果加入分号,则连分号一起替换。一起替换。如:如:#define PI 3.1415926;area = P*r*r;在宏扩展后成为:在宏扩展后成为:area = 3

5、.1315926;*r*r;结果,在编译时出现语法错误。结果,在编译时出现语法错误。5、通常把、通常把#define命令放在一个文件的开头,使其在命令放在一个文件的开头,使其在本文件全部有效。(本文件全部有效。(#define定义的宏仅在本文件有定义的宏仅在本文件有效,在其它文件中无效,这与全局变量不同)。效,在其它文件中无效,这与全局变量不同)。6、宏定义终止命令、宏定义终止命令 #undef结束先前定义的宏名。结束先前定义的宏名。#define G 9.8main()#undef G /* 取消取消G的意义的意义 */f1()7、宏定义中可以引用已定义的宏名。、宏定义中可以引用已定义的宏名

6、。例例8.2 #define R 3.0#define PI 3.1415926#deinfe L 2*PI*R #define S PI*R*Rmain()printf(L=%fnS=%fn,L,S); 8、对程序中用双引号括起来的字符串,即使与宏名相同,也不替换。、对程序中用双引号括起来的字符串,即使与宏名相同,也不替换。例如上例的例如上例的printf语句中,双引号括起来语句中,双引号括起来L和和S不被替换。不被替换。二、带参数的宏二、带参数的宏一般形式:一般形式:#define 宏名(参数表)宏名(参数表) 字符串字符串带参数的宏在展开时,不是进行简单的字符串替换,而带参数的宏在展开时

7、,不是进行简单的字符串替换,而是进行参数替换。例、是进行参数替换。例、例例#define PI 3.1415926#define S(r) PI*r*rmain() float a, area;a = 3.6;area = S(a); printf(r=%fnarea=%fn,a,area);说明:说明: 带参数的宏展开时,用实参字符串替换形参字符串,注意可能发带参数的宏展开时,用实参字符串替换形参字符串,注意可能发生的错误。比较好的办法是宏定义的形参加括号。生的错误。比较好的办法是宏定义的形参加括号。例例 返回多个值的宏定义。返回多个值的宏定义。#define PI 3.1415926#de

8、fine CIRCLE(R,L,S,V) L=2*PI*R;S=PI*R*R;V=4/3*PI*R*R*Rmain() float r,l,s,v; /*半径、圆周长、圆面积、球体积半径、圆周长、圆面积、球体积 */scanf(%f,&r);CIRCLE(r,l,s,v); printf(r=%6.2f,l=%6.2f,s=%6.2f,v=%6.2fn,r,l,s,v);输出结果输出结果:文件包含命令的一般格式是:文件包含命令的一般格式是:#include “文件名文件名”作用:预处理时,把作用:预处理时,把“文件名文件名”指定的文件内容复制到指定的文件内容复制到本文件,再对合并后的文

9、件进行编译。本文件,再对合并后的文件进行编译。例、例、在在file1.c文件中,有文件包含命令文件中,有文件包含命令#include file2.c,预处理时,先把预处理时,先把file2.c的内容复制到文件的内容复制到文件file1.c,再,再对对file1.c进行编译。进行编译。从理论上说,从理论上说,#include命令可以包含任何类型的文件,命令可以包含任何类型的文件,只要这些文件的内容被扩展后符合只要这些文件的内容被扩展后符合C语言语法。语言语法。一般一般#include命令用于包含扩展名为命令用于包含扩展名为.h的的“头文件头文件”,如如stdio.h、string.h、math.

10、h。在这些文件中,一。在这些文件中,一般定义符号常量、宏,或声明函数原型。般定义符号常量、宏,或声明函数原型。说明:说明:1、一个、一个include命令只能指定一个被包含文件,如果要包含命令只能指定一个被包含文件,如果要包含n个文件,用个文件,用n个个Include命令。命令。2、#include命令的文件名,可以使用两种括号。命令的文件名,可以使用两种括号。#include file2.h 先在引用被包含文件的目录查找先在引用被包含文件的目录查找file2.h文件,若没有,文件,若没有,再到系统指定的目录查找。再到系统指定的目录查找。 #include 仅在系统指定的目录查找文件仅在系统指

11、定的目录查找文件file2.h。(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);程序员也可以把自己定义的符号常量、程序员也可以把自己定义的符号常量、宏,或函数原型放在头文件中,用宏,或函数原型放在头文件中,用#include命令包含这些头文件。命令包含这些头文件。(1)文件)文件print_format.h#de

12、fine 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 %s 条件编译条件编译:一般情况下:一般情况下,源程序中所有的行都参加编译。源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才进行但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是编译,也就是对一部分内容指定编译的条件,这就是“条条件编译件编译”。条件编译命令有以下几种形式条件编译命令有以下几种形式(1)#ifdef 标识符标识符 程序段程序段1 #else 程序段程序段2 #endif它的作用是:当所指定的标识符已经被除数它的作用是:当所指定的标识符已经被除数#define命令命令定义过,则在程序编译阶段只编译程序段定义过,则在程序编译阶段只编译程序段1,否则编译否则编译程序段程序段2. (2)#ifdef 标识符标

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论