第 9章 预处理命令 (1学时)
C提供的预处理功能主要有三种:
1,宏定义
2,文件包含
3,条件编译
预处理命令都以符号“#”开头
如,#define
#include
#if ~#else~#endif
宏定义
不带参数的宏定义
格式,#define 标识符 字符串
如,#define PI 3.1415926
作用:用标识符 PI代替,3.1415926”
字符串
以一个简单的名字代替一个长字符串在预编译时进行宏展开
可以用# undef命令终止宏定义的作用域
在进行宏定义时,可以引用已定义的宏名,可以层层置换
例 9.2
1,#define R 3.0
2,#define PI 3.1415926
3,#define L 2*PI*R
4,#define S PI*R*R
5,main( )
6,{
7,printf("L=%f\nS=%f\n",L,S);
8,}
9,结果,L=18.849556
10,S=28.274333
L展开后为,2*3.141592*3.0
S展开后为,3.141592*3.0*3.0
对程序中用双引号扩起来的字符串内的字符不进行置换
宏定义与变量的定义不同,只作字符替换,
不分配内存空间带参的宏定义
格式,#define 宏名 (参数表 ) 字符串
如,#define S(a,b) a*b
area=S(3,2);
展开后,area=3*2;
例 9.3
1,#define PI 3.1415926
2,#define S(r) PI*r*r
3,main( )
4,{float a,area;
5,a=3.6;
6,area=S(a);
7,printf("r=%f\narea=%f\n",area);}
运行结果,r=3.600000
area=40.715038
赋值语句 area=S(a);经宏展开后为:
area=3.1415926*a*a;
讨论:
带参的宏改为,area=S(a+b);
经宏展开后的表达式为:
area=PI*a+b*a+b;
等同于,area=(PI*a)+(b*a)+b;
正确用法,#define S(r) PI*(r)*(r)
“文件包含”处理
一个源文件可以将另一个源文件的全部内容包含进来称“文件包含”
格式,#include,文件名”
或 #include <文件名 >
文件包含的使用可以节省设计人员的重复劳动。如,符号常量的加载
file1.c file2.c
include<file2.c>
A B
file1.c
A
B
条件编译
当条件满足时对一组语句进行编译,否则对另一组语句进行编译
(1)
格式:
#ifdef 标识符程序段1
[#else
程序段2 ]
#endif
(2)
格式:
#ifndef 标识符程序段1
[#else
程序段2 ]
#endif
(3)
格式:
#if 表达式程序段1
#else
程序段2
#endif
例 9.7输入一行字母字符,根据需要设置条件编译,使之能将字母全改为大写输出,或小写字母输出
#define LETTER 1
main( )
{char str[20]="C Language",c;
int i;
i=0;
while((c=str[i])!='\n')
{i++;
#if LETTER
if((c>='a'&&c<='z')
c=c-32;
#else
if((c>='A'&& c<='Z')
c=c+32;
#endif
printf("%c",c);}}
运行结果,C LANGUAGE
第一行改为,#define LETTER 0
运行结果,c language
优点:减少目标代码