C语言程序设计课件 (10)

上传人:zw****58 文档编号:51718249 上传时间:2018-08-16 格式:PPT 页数:34 大小:824.50KB
返回 下载 相关 举报
C语言程序设计课件 (10)_第1页
第1页 / 共34页
C语言程序设计课件 (10)_第2页
第2页 / 共34页
C语言程序设计课件 (10)_第3页
第3页 / 共34页
C语言程序设计课件 (10)_第4页
第4页 / 共34页
C语言程序设计课件 (10)_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《C语言程序设计课件 (10)》由会员分享,可在线阅读,更多相关《C语言程序设计课件 (10)(34页珍藏版)》请在金锄头文库上搜索。

1、第九章 编译预处理9.1宏定义 9.2文件包含处理 9.3条件编译 9.4 带参数的主函数概 述 在前面各单元中我们已经使用了部分以“#”符号开头 的命令。例如,# define、# include等。这些命令是在 源程序正式编译前进行处理的,称为“编译预处理”命令。编译预处理主要包括宏的处理、包含文件的处理、条 件编译的处理等。宏定义 1、不带参数的宏定义 用一个指定的标识符(即名字)来代表一个字符串 它的一般形式为define 标识符 字符串这就是已经介绍过的定义符号常量。如:define PI 3.1415926#define PI 3.1415926 main() float l,s,

2、r,v;printf(“input radius:”);scanf(“%f”,l=2.0*PI*r;s=PI*r*r;v=3.0/4*PI*r*r*r;printf(“l=%10.4fns=%10.4fnv=%10.4fn”,l,s,v); 例1:下面的程序使用了宏定义,给出其运行结果运行情况如下: input radius:4 l=25.1328 s=50.2655 v=150.79663、说明: (1)宏名一般习惯用大写字母表示,以便与变量名相区别。 (2)使用宏名代替一个字符串,可以减少程序中重复书写某些字符串的工作量。(3)宏定义是用宏名代替一个字符串,也就是作简单的置换,不作正确性检

3、查。 (4)宏定义不是C语句,不必在行末加分号。如果加了分号则会连分号一起进行置换。如:define PI 3.1415926;areaPI* r* r; 经过宏展开后,该语句为area 3.1415926;* r* r ; 显然出现语法错误。(5)define命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束。通常, define命令写在文件开头,函数之前,作为文件一部分,在此文件范围内有效。(6)可以用undef命令终止宏定义的作用城。例如: # define G 9.8 main() . # undef G f1() .G的有效范围(7)在进行宏定义时,可以引用已定义

4、的宏名,可以层层置换。#define R 3.0 #define PI 3.1415926 #define L 2*PI*R #define S PI*R*R main() printf(“L=%fnS=%fn”,L,S); 例2 分析下面程序的运行结果运行情况如下: L=18.849556 S=28.274333 (8)对程序中用双括号括起来的字符串内的字符,即使与宏名相同,也不进行置换。(9)宏定义是专门用于预处理命令的一个专用名词,它与定义变量的含义不同,只作字符替换,不分配内存空间。4、带参数的宏定义 带参数的宏定义除了字符串替换之外,还要进行参数的替换。 定义的一般形式为define

5、 宏名(参数表) 字符串 字符串中包含在括弧中所指定的参数。如:define S(a,b) a *barea=S(3,2);例3:分析下面程序的运行结果#define PI 3.1415926 #define S(r) PI*r*r main() float a,area;a=3.6;area=S(a);printf(“r=%fnarea=%fn”,a,area); 运行结果如下: r=3.600000 area=40.715038 赋值语句area=S(a);经宏展开后为 area=3.1415926*a*a 5、说明: (1)对带参数的宏的展开只是将语句中的宏名后面括号内的实参字符串代替

6、define命令行中的形参。(2)在宏定义时,在宏名与带参数的括弧之间不应加空格,否则将空格以后的字符都作为替代字符串的一部分。例如,如果有define S (r) PI*r*r 被认为 S是符号常量(不带参的宏名),它代表字符串“(r) PI r r”。如果在语句中有area=S (a);则被展开为area=(r) PI*r*r (a)显然不对了。(3)带参的宏定义与函数是不同的。主要有: 函数调用时,先求出实参表达式的值,然后带入形参。而使用带参的宏只是进行简单的字符替换。 函数调用是在程序运行时处理的,分配临时的内存单元。而宏展开则是在编译时进行的,在展开时并不分配内存单元,不进行值的传

7、递处理,也没有“返回值”的概念。 对函数中的实参和形参都要定义类型,二者的类型要求一致,如不一致,应进行类型转换。而宏不存在类型问题,宏名无类型,它的参数也无类型,只是一个符号代表,展开时代入指定的字符即可。宏定义时,字符串可以是任何类型的数据。例如:define CHAR1 CHINA(字符) define a 3.6 (数值) 调用函数只可得到一个返回值,而用宏可以设法得到几个结果。 使用宏次数多时,宏展开后源程序长,因为每展开一次都使程序增长,而函数调用不使源程序变长。 宏替换不占运行时间,只占编译时间。而函数调用则占运行时间(分配单元、保留现场、值传递、返回)。一般用宏来代表简短的表达

8、式比较合适。有些问题,用宏和函数都可以。如:define MAX(x,y) (x)(y)? (x):(y) main() int a,b,c,d,t;t= MAX(a+b,c+d); 赋值语句展开后为t(ab)(cd)? (ab):(cd); 注意:MAX不是函数,这里只有一个宏,在main函数中就能求出t的值。这个问题也可用函数来求: int max(int x,int y) return(xy?x:y); main() int a,b,c,d,t;t= max(a+b,c+d); max是函数,在main函数中调用max函数才能求出t的值。#define PR printf #define

9、 NL n” #define D ”%d #define E %d #define D1 D NL #define D2 D E NL #define D3 D E E NL #define D4 D E E E NL #define S “%s” 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); 例4:分析下面程序的运行结果:运行时输出以下结果: 1 12 123 1234 CHINA文件包含命令可以将另一个C

10、源程序的 全部内容包含进来,它可以避免不必要的 重复劳动。 文件包含处理 1、一般形式: include “文件名” 或 include 2、例:可以将例4程序改为: (1)文件 format.h#define PR printf#define NL n”#define D “%d#define E %d#define D1 D NL#define D2 D E NL#define D3 D E E NL#define D4 D E E E NL#define S “%s”(2)文件file1.c#include “format.h”main()int a,b,c,d;char string=

11、“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); 3、说明 (1)一个include命令只能指定一个被包含文件,如果要包含n个文件,要用n个include命令。(2)如果文件1包含文件2,而文件2中要用到文件3的内容,则可在文件1中用两个include命令分别包含文件 2和文件3,而且文件3应出现在文件2之前,即在 filel.c中定义:include “file3.h”include “file2.h”(3)在一个被包含文件中又可以包含另一个被包含文件,即文件包含是可以嵌套的。(4)在include命令中,文件名可以用双引号或尖括号括起来。二者的区别是用尖括号(即=a for(i=1;i #define LETTER 1 main() char str20=“C Language”, c; int i = 0; while (c=stri+)!=0) #if LETTER if (c = a #endif printf(“%c”, c);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 教育学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号