1 / 10

预 处 理

预 处 理. 信息管理系. 引言. 编译预处理是在编译时对程序进行加工处理。预处理程序允许进行简单的宏替换、条件编译和将其他文件中的内容包含进来等功能。任何处理命令都 以#开头 , 末尾不加分号 。 C 提供的预处理功能主要有以下三种: 1 、宏替换 2 、文件包含 3 、条件编译. 二、文件包含. 文件包含是指一个源文件可以将另一个文件的全部内容包含到本文件之中。 文件包含的一般形式为: #include” 包含文件名“ 或 #include< 包含文件名 > 说明:

marlee
Download Presentation

预 处 理

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 预 处 理 信息管理系

  2. 引言 编译预处理是在编译时对程序进行加工处理。预处理程序允许进行简单的宏替换、条件编译和将其他文件中的内容包含进来等功能。任何处理命令都以#开头,末尾不加分号。 C提供的预处理功能主要有以下三种: 1、宏替换 2、文件包含 3、条件编译

  3. 二、文件包含 文件包含是指一个源文件可以将另一个文件的全部内容包含到本文件之中。 文件包含的一般形式为: #include”包含文件名“ 或#include<包含文件名> 说明: • 一个文件包含命令只能指定一个被包含文件,如果要包含多个文件,需要多个#include命令 • 被包含的文件可以分两类:一类是用户字定义的文件,一类是系统提供的标准库函数 • 一个被包含文件中可以包含另一个被包含文件,即文件包含是可以嵌套的。 • 被包含文件与其所在的文件在预编译后已成为同一个文件。 例如arr.c 可以包含文件的路径。

  4. 一、宏替换 1、不带参数的宏替换(字符串宏替换) 用一个指定的标识符(即名字)来代表一个字符串。 #define 宏名 字符串 例如:#define PI 3.14159 在编译预处理时,将程序中的所有PI都用3.15159进行替换。 说明: • 宏名一般使用大写字母,其命名规则符合标识符的构成规则 • 宏定义是用宏名代替一个字符串,只限于简单的替换,并不做语法检查,也不分配内存空间。 • #define出现在所有函数之外,作用域到本程序结束 • 在进行宏定义时,可以引用已定义的宏名 • 对程序中用双引号括起来的字符串内的字符,即使与宏名相同也不作替换。 • 可以用#undef命令终止宏定义的作用域。 • 宏不仅可以是字符串常数,也可以是表达式或语句组成的字符串。

  5. 2、带参数的宏定义 宏定义不仅可以进行简单的字符替换,还可以进行参数替换。 #define 宏名(参数) 表达式 例如:#define s(a,b) a*b 说明: 宏名与参数表之间不能有空格 表达式是被宏名所代换的字符串,表达式中应包含括号中指定的参数 宏调用的一般形式为:宏名(实参) 例如:

  6. 练习: 1、下列程序的输出结果是(8) #define MA(x) x*(x-1) main() {int a=1,b=2; printf(“%d\n”, MA(1+a+b)); } 2、以下程序的输出结果是(7) #define MAX(x,y) (x)>(y)?(x):(y) main() {int a=5,b=2,c=3,d=3,t; t=MAX(a+b,c+d)*10; printf(“%d\n”, t); }

  7. 练习: 3、设有如下的宏定义: #define N 3 #define Y(n) ((N+1)*n) 则执行语句:z=2*(N+Y(5+1));后,z 的值为(48) 4、设有如下宏定义: #define MYSWAP(z,x,y) {z=x;x=y;y=z;} 以下程序段通过宏调用实现变量a,b内容的交换,请填空: float a=5,b=16,c; MYSWAP(,a,b);

  8. 带参数的宏与函数的区别 1、函数调用时,先求出实参表达式的值,然后代入形参。而使用带参数的宏,只是进行简单的字符替换。 2、函数调用是在程序运行时进行的,函数运行时为形参分配临时的存储单元;而宏展开则是在编译前进行的,在展开时并不分配存储单元,也不进行值的传递,也没有返回值的概念。 3、对函数中的实参和形参都要求定义类型,二者的类型要求一致,如不一致,要进行类型转换。而宏不存在类型问题,宏名无类型,它的参数也无类型。 4、调用函数只可得到一个返回值,而用宏可以设法得到多个结果,如:p9_1。 5、使用宏可以使源程序变长,而函数调用不会增加源程序的长度; 6、宏替换不占用运行时间,只占用编译时间,而函数调用则占用运行时间。

  9. #define PI 3.14159 • #define CIRCLE(R,L,S,V) L=2*PI*R;S=PI*R*R;V=4.0/3*PI*R*R*R • main() • { • float r,l,s,v; • scanf("%f",&r); • CIRCLE(r,l,s,v); • printf("\nr=%6.2f,l=%6.2f,s=%6.2f,v=%6.2f",r,l,s,v); • } • 宏展开后变为:

  10. 实验十二 实验名称:不同的变量和编译预处理练习 实验目的: 1、掌握各种变量的概念和使用方法 2、掌握宏定义和宏展开的方法; 3、掌握文件包含的处理方法; 实验要求:编写程序并上机运行 1、求两个整数的最大公约数和最小公倍数。用一个函数求最大公约数,用另一函数根据求出的最大公约数求最小公倍数。 ①用全局变量的方法。将两个整数的最大公约数、最小公倍数都设为全局变量 ②不用全局变量,两个整数在主函数中输入,函数中的变量分别定义,在主函数中输出最大公约数和最小公倍数。 2、定义一个带参数的宏,使两个参数的值互换。在主函数中输入两个数作为使用宏的实参,输出已交换后的两个值。 要求:在程序主函数使用宏时只能用两个实参,如:SWAP(a,b),不能用三个实参。

More Related