第九章 编译预处理第一节 宏定义
1.不带参数的宏定义一般形式:
#define 宏名 字符串其中,,#” 表示一条预处理命令,,define”为宏定义命令,
,宏名,为一个合法的标示符
,字符串,可以是常数、表达式、语句等如,#define PI 3.1415926
例,一个简单的宏定义
#define E 2.71828
#include,math.h”
main()
{
float sum;
sum=sqrt(E)+E+E*E+E*E*E+E*E*E*E;
printf(“%f”,sum);
}
若要把 E的值改为 2.71427
4 7
关于不带参数的宏定义使用的说明,
( 1) #与 define之间一般不留空格,但宏名两边必须有空格
( 2)宏名习惯采用大写字母表示,以与变量名区别,但也可以是小写
( 3)宏定义与变量定义含义不同,宏定义只做简单的置换,并不分配内存空间
( 4)宏定义用宏名代替一个字符串,是一种机械的置换,不做任何语法检查如,#define A 3.o59
关于不带参数的宏定义使用的说明,
( 5)因为不是 C语言,所以宏定义结尾不用加
,;,如,#define P 2.7189;
… …
sum=P*P;
sum=2.7189; *2.7189; ;
( 6)宏定义的嵌套使用如,#define PI 3.1415926
#define R 5.5
#define CIRCLE 2.0* PI* R
#define AREA PI* R * R
关于不带参数的宏定义使用的说明,
( 7)宏名的有效范围为从定义之处到本源文件结束。习惯上,#define写在程序最前面
( 8)宏名出现在一对双引号中,将不会产生置换如,#define P 2.7189
main()
{
printf(“P=%d”,P);
}
结果,P=2.7189
关于不带参数的宏定义使用的说明,
( 9)宏定义还可以定义运算符、表达式、甚至可以把格式语句作为宏定义如,#define R 3.5
#define AREA 3.1415926*R*R
#define P printf
#define F,%f\n”
main()
{
P(F,AREA);
}
结果,38.484509
2,带参数的宏定义一般形式:
#define 宏名 (参数表) 字符串如,#define AREA(x,y) x*y
…
total=AREA(3,6);
area=AREA(3*3,7/2);
…
total=3*6;
area=3*3*7/2;
如,#define P(a,b) a*b
…
area= P(3+4,5+6); area=3+4*5+6;
关于带参数的宏定义使用的说明,
( 1)在定义带参数的宏时,字符串内的参数通常要用括号括起来,以避免出错如,#define P(a,b) ( a) *( b)
…
area= P(3+4,5+6);
( 2)宏名与形参表之间不能有空格如,#define P (a,b) a*b
关于带参数的宏定义使用的说明,
( 3)带参数的宏与带参数的函数区别:
在编译预处理之前,
不占运行时间,
只占编译时间在程序运行时进行,
占用运行时间带参数的宏 带参数的函数只是简单、机械的字符串置换 单向的值传递过程宏名无类型,
宏参也无类型形参、实参要求类型一致例 1:用带参数的宏计算并输出两个数中较小数
#define MIN(x,y) (x<y)?x:y
main()
{
scanf(“%d,%d”,&i,&j);
printf(“%d\n”,MIN(i,j));
}
若输入,34,-56
结果,-56
例 2:宏调用
#define SQ(n) (n)*(n)
main()
{
int i=1;
while(i<=10)
printf(“%5d”,SQ(i++));
}
结果,2 12 30 56 90
第二节 文件包含一般形式:
#include 〈包含文件〉
或,#include,包含文件,
其中,,包含文件,是磁盘中文本文件的名字如,#include 〈 stdio.h〉
#include,stdio.h”
关于文件包含使用的说明,
( 1)在 C语言中,定义一 条 #include语句,就相当于 include语句后面的源文件的全部内容写在该位置上
f1.c
#include,f2.c”
f1语句
f2.c
f2语句
f1.c
f2语句
f1语句关于文件包含使用的说明,
( 2)一个 include命令只能指定一个包含文件,
若有多个文件要包含,则需要用多条 include
( 3)文件包含可以嵌套
( 4)在 #include中,双引号的含义与尖括号含义的区别例,文件包含简单使用
#include,f2.c”
main()
{
float r=3.0,area;
area=PI*r*r;
PR(F,area);
}
f1文件 f2文件
#define PI 3.1415926
#define PR printf
#define F,%f\n”
第三节 条件编译
1.格式 1
一般形式:
#ifdef 标识符程序段 1
#else
程序段 2
#endif
功能:如果标识符已经被 #define命令定义过,
则在程序编译时只对程序段 1进行编译;
否则,反之例,条件编译使用
#define LEN 1
#ifdef LEN
#define PI 3.1415926
#else
#define PI 3.14
#endif
main()
{
float r=3.65,area;
area= PI*r*r;
printf(“%f”,area);
}
2.格式 2
一般形式:
#ifndef 标识符程序段 1
#else
程序段 2
#endif
功能:如果标识符没有被 #define命令定义过,
则在程序编译时只对程序段 1进行编译;
否则,反之
3.格式 3
一般形式:
#if 常量表达式程序段 1
#else
程序段 2
#endif
功能:如果常量表达式的值为 1,在程序编译时只对程序段 1进行编译;
否则,反之
1.不带参数的宏定义一般形式:
#define 宏名 字符串其中,,#” 表示一条预处理命令,,define”为宏定义命令,
,宏名,为一个合法的标示符
,字符串,可以是常数、表达式、语句等如,#define PI 3.1415926
例,一个简单的宏定义
#define E 2.71828
#include,math.h”
main()
{
float sum;
sum=sqrt(E)+E+E*E+E*E*E+E*E*E*E;
printf(“%f”,sum);
}
若要把 E的值改为 2.71427
4 7
关于不带参数的宏定义使用的说明,
( 1) #与 define之间一般不留空格,但宏名两边必须有空格
( 2)宏名习惯采用大写字母表示,以与变量名区别,但也可以是小写
( 3)宏定义与变量定义含义不同,宏定义只做简单的置换,并不分配内存空间
( 4)宏定义用宏名代替一个字符串,是一种机械的置换,不做任何语法检查如,#define A 3.o59
关于不带参数的宏定义使用的说明,
( 5)因为不是 C语言,所以宏定义结尾不用加
,;,如,#define P 2.7189;
… …
sum=P*P;
sum=2.7189; *2.7189; ;
( 6)宏定义的嵌套使用如,#define PI 3.1415926
#define R 5.5
#define CIRCLE 2.0* PI* R
#define AREA PI* R * R
关于不带参数的宏定义使用的说明,
( 7)宏名的有效范围为从定义之处到本源文件结束。习惯上,#define写在程序最前面
( 8)宏名出现在一对双引号中,将不会产生置换如,#define P 2.7189
main()
{
printf(“P=%d”,P);
}
结果,P=2.7189
关于不带参数的宏定义使用的说明,
( 9)宏定义还可以定义运算符、表达式、甚至可以把格式语句作为宏定义如,#define R 3.5
#define AREA 3.1415926*R*R
#define P printf
#define F,%f\n”
main()
{
P(F,AREA);
}
结果,38.484509
2,带参数的宏定义一般形式:
#define 宏名 (参数表) 字符串如,#define AREA(x,y) x*y
…
total=AREA(3,6);
area=AREA(3*3,7/2);
…
total=3*6;
area=3*3*7/2;
如,#define P(a,b) a*b
…
area= P(3+4,5+6); area=3+4*5+6;
关于带参数的宏定义使用的说明,
( 1)在定义带参数的宏时,字符串内的参数通常要用括号括起来,以避免出错如,#define P(a,b) ( a) *( b)
…
area= P(3+4,5+6);
( 2)宏名与形参表之间不能有空格如,#define P (a,b) a*b
关于带参数的宏定义使用的说明,
( 3)带参数的宏与带参数的函数区别:
在编译预处理之前,
不占运行时间,
只占编译时间在程序运行时进行,
占用运行时间带参数的宏 带参数的函数只是简单、机械的字符串置换 单向的值传递过程宏名无类型,
宏参也无类型形参、实参要求类型一致例 1:用带参数的宏计算并输出两个数中较小数
#define MIN(x,y) (x<y)?x:y
main()
{
scanf(“%d,%d”,&i,&j);
printf(“%d\n”,MIN(i,j));
}
若输入,34,-56
结果,-56
例 2:宏调用
#define SQ(n) (n)*(n)
main()
{
int i=1;
while(i<=10)
printf(“%5d”,SQ(i++));
}
结果,2 12 30 56 90
第二节 文件包含一般形式:
#include 〈包含文件〉
或,#include,包含文件,
其中,,包含文件,是磁盘中文本文件的名字如,#include 〈 stdio.h〉
#include,stdio.h”
关于文件包含使用的说明,
( 1)在 C语言中,定义一 条 #include语句,就相当于 include语句后面的源文件的全部内容写在该位置上
f1.c
#include,f2.c”
f1语句
f2.c
f2语句
f1.c
f2语句
f1语句关于文件包含使用的说明,
( 2)一个 include命令只能指定一个包含文件,
若有多个文件要包含,则需要用多条 include
( 3)文件包含可以嵌套
( 4)在 #include中,双引号的含义与尖括号含义的区别例,文件包含简单使用
#include,f2.c”
main()
{
float r=3.0,area;
area=PI*r*r;
PR(F,area);
}
f1文件 f2文件
#define PI 3.1415926
#define PR printf
#define F,%f\n”
第三节 条件编译
1.格式 1
一般形式:
#ifdef 标识符程序段 1
#else
程序段 2
#endif
功能:如果标识符已经被 #define命令定义过,
则在程序编译时只对程序段 1进行编译;
否则,反之例,条件编译使用
#define LEN 1
#ifdef LEN
#define PI 3.1415926
#else
#define PI 3.14
#endif
main()
{
float r=3.65,area;
area= PI*r*r;
printf(“%f”,area);
}
2.格式 2
一般形式:
#ifndef 标识符程序段 1
#else
程序段 2
#endif
功能:如果标识符没有被 #define命令定义过,
则在程序编译时只对程序段 1进行编译;
否则,反之
3.格式 3
一般形式:
#if 常量表达式程序段 1
#else
程序段 2
#endif
功能:如果常量表达式的值为 1,在程序编译时只对程序段 1进行编译;
否则,反之