C语言程序设计教案 第九章 编译预处理

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第九章编译预处理

课题:第九章编译预处理

教学目的:1、了解预处理的概念及特点

2、掌握有参宏与无参宏的定义及使用,领会文件包含的使用及效果

教学重点:教学难点:掌握宏的使用,文件包含有参宏与无参宏的使用

步骤一复习引导

ANSI C标准规定可以在C源程序中加入一些“预处理命令”,以改进程序设计环境,提高编程效率。

这些预处理命令是由ANSI C统一规定的,但它不是C语言本身的组成部分,不能直接对它们进行编译。必须在对程序进行通常的编译之前,先对程序中这些特殊的命令进行“预处理”,即根据预处理命令对程序作相应的处理。经过预处理后程序不再包括预处理命令了,最后再由编译程序对预处理后的源程序进行通常的编译处理,得到可供执行的目标代码。

步骤二讲授新课

C语言与其他高级语言的一个重要区别是可以使用预处理命令和具有预处理的功能。C 提供的预处理功能主要有以下三种:宏定义、文件包含、条件编译。

分别用宏定义命令、文件包含命令、条件编译命令来实现。为了与一般C语句相区别,这些命令以符号“ #” 开头。

§9.1宏定义

宏:代表一个字符串的标识符。

宏名:被定义为“宏”的标识符。

宏代换(展开):在编译预处理时,对程序中所有出现的“宏名”,用宏定义中的字符串去代换的过程。

一、不带参数的宏定义

一般形式:#define 标识符字符串

#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 = 3.0/4*PI*r*r*r;

printf(“%10.4f,%10.4f,%10.4\n”, l, s, v);

}

例如:由键盘输入y值,求表达式:

3(y2+3y)+ 4(y2+3y)+ y(y2+3y)

#define M (y*y+3*y)

main()

{ int s, y;

printf( “Input a number :”); scanf (“%d”,&y);

s=3*M+4*M+y*M; p rintf(“s=%d\n”,s);

}

先宏展开:s=3*(y*y+3*y) +4*( y*y+3*y) + y*(y*y+3*y)

再与源程序合并

说明:

⑴宏名一般用大写表示,以便与变量名区分。

⑵使用宏名使程序易读,易修改。

⑶只作简单的置换,不作正确性检查。

⑷宏定义不是C语句,不必在行末加分号。

⑸宏名的作用域一般从自定义命令到本源文件结束。

⑹可以用# undef命令终止宏定义的作用域。

⑺宏定义允许嵌套,允许层层置换。

⑻宏名在源程序中用双引号括起来,则TC中预处理不对其作宏代换。

例:printf(“L=%f”, L); 中双引号内L不替换。

⑼宏定义与定义的变量不同,宏只作字符替换,不分配内存空间。

⑽对“输出格式”进行宏定义,可以减少书写麻烦

例如:

#define P printf

#define D “%d,%d,%d\n”

#define F “%6.2f,%6.2f,%6.2f\n”

main()

{ int a=5,c=8,e=11;

float b=3.8,d=9.7; f=21.08;

P(D,a,c,e);

P(F,b,d,f);

P(F,a+b,c+d,e+f);

}

二、带参数的宏定义

格式:#define 宏名(参数表) 字符串

例:#define s(a,b) a*b

{……

area =s(3,2);

……}

对带参的宏展开后,为area=3*2;

例:#define M(y) y*y+3*y

{……

k=M(5);

……}

对其展开后,为k=5*5+3*5;

说明:

⑴对带参数的宏展开只是将宏名后括号内的实参

字符串代替#define命令行中的形参。

⑵宏定义时,在宏名与带参数的括号之间不应加

空格,否则将空格以后的字符都作为替代字符

串的一部分。

⑶带参宏定义,形参不分配内存单元,因此不必

作类型定义。(与函数的区别之一)

⑷带参宏与函数的区别之二:

例如:

main()

{ int i=1;

while( i<=5 ) printf(“%d\t”,SQ( i++));}

SQ(int y)

{ return(y)*(y); }

其结果为:1 4 9 16 25

如:

#define SQ(y) ((y)*(y))

main()

{ int i =1;

while( i<=5 )

printf(“%d\t”,SQ( i++));

}

运行结果:

2 12 30

例:利用宏定义求两个数中的大数。

#define MAX(a,b) (a>b)?a:b

main()

{int x, y, max;

scanf(“%d%d”, &x, &y);

相关文档
最新文档