C语言的编译预处理.ppt

上传人:牧羊曲112 文档编号:6503948 上传时间:2023-11-07 格式:PPT 页数:35 大小:307.99KB
返回 下载 相关 举报
C语言的编译预处理.ppt_第1页
第1页 / 共35页
C语言的编译预处理.ppt_第2页
第2页 / 共35页
C语言的编译预处理.ppt_第3页
第3页 / 共35页
C语言的编译预处理.ppt_第4页
第4页 / 共35页
C语言的编译预处理.ppt_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《C语言的编译预处理.ppt》由会员分享,可在线阅读,更多相关《C语言的编译预处理.ppt(35页珍藏版)》请在三一办公上搜索。

1、第九章 编译预处理,第九章 编译预处理,编译预处理:在源程序文件中,加入“编译预处理命令”,使编译程序在对源程序进行通常的编译之前,先对这些命令进行预处理,然后将预处理的结果和源程序一起再进行通常的编译处理,以得到目标代码(OBJ文件)。,C提供的编译预处理命令,这些命令均以#开头,以区别于语句。,9.1 宏(Macro),一、不带参数的宏一般形式:#define 标识符 字符串如:#define PI 3.1415926#define:宏定义命令#undef:终止宏定义命令,例9.1,#define PI 3.1415926 main()float l,s,r,v;printf(“input

2、 radius:”);scanf(“%f”,关于宏定义的说明:,1、一般宏名用大写字母表示。2、使用宏可以提高程序的可读性和可移植性。如上述程序中,多处需要使用值,用宏名既便于修改又意义明确。3、宏定义是用宏名代替字符串,宏扩展时仅作简单替换,不检查语法。语法检查在编译时进行。4、宏定义后面不能有分号。如果加入分号,则连分号一起替换。,例如:#define PI 3.1415926;area=PI*r*r;在宏扩展后成为:area=3.1315926;*r*r;结果在编译时出现语法错误。,5、通常把#define命令放在一个文件的开头,使其在本文件全部有效。(#define定义的宏仅在本文件有

3、效,在其它文件中无效,这与全局变量不同)。6、宏定义终止命令#undef结束先前定义的宏名。#define G 9.8main()#undef G/*取消G的意义*/f1(),7、宏定义中可以引用已定义的宏名。例9.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 宏名(参数表)字符串 带参数

4、的宏在展开时,不是进行简单的字符串替换,而是进行参数替换。例、,#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);,说明:,1、带参数的宏展开时,用实参字符串替换形参字符串,注意可能发生的错误。比较好的办法是宏定义的形参加括号。,2、宏定义时,宏名与参数表间不能有空格。例、#define S(r)PI*r*r(表示空格),带参数的宏定义与函数的区别:,例9.4 返回多个值的宏定义。,#define PI 3.1415926#define CI

5、RCLE(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,例9.5 输出格式定义为宏,#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(D

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

7、些文件中,一般定义符号常量、宏,或声明函数原型。下表是Turbo C 2.0的头文件,(1)文件print_format.h#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%s(2)文件file1.c#include print_format.hmain()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,

8、b,c);PR(D4,a,b,c,d);PR(S,string);,说明:,1、一个include命令只能指定一个被包含文件,如果要包含n个文件,用n个Include命令。2、#include命令的文件名,可以使用两种括号。#include file2.h 先在引用被包含文件的目录查找file2.h文件,若没有,再到系统指定的目录查找。#include 仅在系统指定的目录查找文件file2.h。Turbo C系统指定的目录,在Options|Directores菜单设定。,3、被包含文件与其所在文件,在预处理后,成为一个文件,因此,如果被包含文件定义有全局变量,在其它文件中不必用extern关

9、键字声明。但一般不在被包含文件中定义变量。,9.3 条件编译,一般情况下,源程序中的所有行均参加编译,但有时希望部分行在满足一定条件才进行编译,即对部分内容指定编译的条件,称为“条件编译”。,有以下几种条件编译命令:一、#ifdef,printf()语句被编译,程序运行时可以显示x、y、z的值。在程序调试完成后,不再需要显示x、y、z的值,则只需要去掉DEBUG标识符的定义。直接使用printf()语句显示调试信息,在程序调试完成后去掉printf()语句,也可以达到目的。但如果程序中有很多处需要调试观察,增、删语句既麻烦有容易出错。而使用条件编译则相当清晰、方便。,二、#ifndef,#if

10、ndef 标识符 程序段1#else程序段2#endif#ifndef 标识符 程序段1#endif,其中,“标识符”用#define命令定义。例、程序调试信息的显示。#define DEBUG#ifdef DEBUGprintf(x=%d,y=%d,z=%dn,x,y,z);#endif,程序运行时printf()语句被编译,可以显示x、y、z的值。在程序调试完成后,不再需要显示x、y、z的值,则只需要去掉DEBUG标识符的定义。直接使用printf()语句显示调试信息,在程序调试完成后去掉printf()语句,也可以达到目的。但如果程序中有很多处需要调试观察,增、删语句既麻烦有容易出错。而

11、使用条件编译则相当清晰、方便。,二、#ifndef,#ifndef 标识符 程序段1#else程序段2#endif#ifndef 标识符 程序段1#endif,三、#if,#if 表达式 程序段1#else程序段2#endif,例9.8 输入一行字母字符,根据需要设置条件编译,使之能将字母全改为大写输出,或全该为小写输出。,#define LETTER 1main()char str20=C Language,c;int i;i=0;while(c=stri)!=0)i+;#if LETTER if(c=a,补充练习:,1、有如下程序#define N 2#define M N+1#define NUM 2*M+1#main()int i;for(i=1;i=NUM;i+)printf(“%dn”,i);该程序中的for循环执行的次数是 A)5 B)6 C)7 D)8,B,2、以下程序的输出结果是(),16 B)2 C)9 D)1#define SQR(X)X*Xmain()int a=16,k=2,m=1;a/=SQR(k+m)/SQR(k+m);printf(“%dn,a);,B,本章要求及作业要求:1、熟悉宏定义与宏扩展。宏与函数的区别。2、熟悉文件包含命令#include的作用及其预处理方法。3、熟悉条件编译的使用。作业:9.1,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号