第6章 编译预处理 预处理:是指在进行编译之前所作的工作。 预处理由预处理程序负责完成。当对一个源文件进行编译时, 编译系统将自动引 用预处理程序对源程序中的预处理命令作处理, 处理完毕后自动进入对源程序的编译。 预处理命令:#define,#undef,#inc lude,#else,#error……预处理命令行可位于程序中任意位置预处理命令行的作用域:定义位置开始到文件结尾6.1 宏定义: #define6.2 文件包含:#include第6章 编译预处理 宏定义是由源程序中的宏定义命令完成的。 在C语言中,“宏” 分为有参数宏和无参宏两种。6.1 宏定义: #define如:无参宏 #define PI 3.1415926如 :有参宏 # define AS(x,y,z) x+y+z无参宏定义一般形式: #define 宏名 宏体define:宏定义命令 宏名:由标识符定义宏体:为一字符串(常量、表达式、格式串等)define、宏名、宏体之间用空格隔开 宏调用格式:宏名宏替换:编译预处理时进行宏展开,对宏定义命令行后出现的宏名用宏体代替。#define PI 3.1415926m ain(){float a,s,r; printf("Input radius r:"); scanf("%f", &r); a= 2PIr; s=PIrr;printf("r=%10.4f\na=%10.4f\ns=%10.4f\n",r,a,s );}宏替换后: a=23.1415926r;s=3.1415926rr; 实 例宏调用 宏替换时只是简单地 以宏体取代宏名,预处理程序并不作语法检查。如有错误,只能在编译时发现。 #define PI 3.141593; …… L=2PIr; 宏展开后,该语句为:L=23.141593;r;宏名在源程序中若用引号引起来,则预处理程 序不对其作宏代换。如:#define no 220 m ain() { printf(“no”); } 说 明出错不替换 宏定义可以嵌套: 在宏体中可以使用已经定义的宏名。在宏展开时由预处理程序层层代换。 以下程序中的for 循环执行的次数是( )。#define N 2#define M N+1#define NUM 2M+1mai n(){ int i; for(i=1;i<=NUM;i++)printf(“%d\n”,i); }A. 5 B. 6 C. 7 D. 8 说 明思考#define M yy+3y main(){ int s,y; printf("input a number: "); scanf("%d",&y); s=3M +4M +5M; printf("s=%d\n",s); }yy+3yy y+3yyy+3y(yy+3y)(yy+3y)(yy+3y)继续理解带参宏定义一般形式: #define 宏 名(形参表) 宏体宏调用:宏名(实参表)宏替换:编译预处理时用宏体代换带参宏,同时用实参代换形参例如: # define AS(x,y,z) x+y+z …… sum=AS(3,4,5); 宏替换后:sum=3+4+5;宏定义时,在宏 名与带参数的括号之间不能有空格,否则将空格以后的字符都作为宏体. 例如: #define s (r) PIrr下 列程序执行后的输出结果是( )。#define MA(x) x(x-1)main(){ int a=1,b=2; printf(“%d \n”, MA(1+a+b));}A. 6 B. 8 C. 10 D. 1 2 说 明思考是指一个源文件可将另一个源文件的全部内容包含进来一般形式: #include “文 件名” 或 #include <文件名> 所包含的文件可以是标准文件或用户自定义文件 例如: #include “math.h”6.2 文 件 包 含#include 命令行一般放在程序开头。一个程序中,允许有任意多个预编译命令行预编译时, 预处理程序把指定的文件插入该命令行位置取代该命令行,从而把指定的文件和当前的源程序文件连成一个源文件。 /文件4.c/fl oat ave(float a[ ],int n){ int k ; float aver, sum=a[0]; for (k=1; k /文件3.c/#include “4.c"main ( ){ float s[10]; int k; for (k=0; k<10; k++) scanf ("%f",&s[k]); printf("%5.2f\n",ave(s,5));} 说 明本章小结本章介绍的预编译功能(宏定义、文件包含、条件编译)是C语言特有的,有利于程序的可移植性,增加程序的灵活性。C语言中的宏定义分为两种:不带参数的宏定义和带参数的宏定义。 使用标准库函数时,应当包含相应的头文件。也可设计自己的头文件,将常用内容包含进去。 |
|