第九章 预处理命令
学习目的与要求:1,掌握宏定义。
2,重点掌握文件包含。
3,了解条件编译。
重点:宏定义和文件包含
知识归纳
1,预处理命令
(1) C语言中有三种预处理命令:宏定义、文件包含和条件编译。
(2) 预处理命令均以#开头,结尾没有分号。
(3) 预处理命令在编译时执行。
2,不带参数的宏定义
(1) 概念:用一个符号代替一个字符串。
(2) 格式:# define 符号 字符串
如 # define PI 3.1415926
宏常常用大写。
3,带参数的宏定义
(1) 概念:用一个带参数的符号代替字符串;不是简单的替换,还要进行参数替换。
(2) 格式:# define 符号(参数) 字符串
如 # define S( a,b ) a * b
注意:在带参数的宏定义中,参数如果是表达式,要注意将被替换的字符串中的参数加() 括起来,否则,替换结果不正确。
如,# define S( a,b ) a / b
//执行 S( 2+3,5+7 ) ;
编译时替换的结果是,2+3 / 5+ 7,显然不是想要得结果;
如改成 # define S( a,b ) (a ) / (b)
//执行 S ( 2+3,5+7 ) ;
编译时替换的结果是,( 2+3) /( 5+ 7)
4,文件包含
(1) 概念:文件包含是指一个源文件可以将另一个源文件的全部内容包含进来。
(2) 格式:# include <文件名,扩展名>
# include,文件名,扩展名”
第二部分 C语言程序设计同步训练
·225·
·225·
(3) 两种格式的区别
用< >时,系统到存放C库函数头文件所在的目录中寻找要包含的文件;如果为调用库函数使用文件包含命令,往往用尖括号,以节省时间。
用,”时,系统先到用户当前目录(即存放当前程序的目录) 查找要包含的文件,若找不到,在到C库函数头文件所在的目录中寻找;如果要包含的是用户自己编写的文件(这种文件一般都在当前目录中),一般用g2464g5353号。
(4) 常用包含的C库文件
使用数g4410函数时:# include <math.h>
使用字符串函数时:# include <string.h>
使用g17767g1849g17767g1998函数时:# include <stdio.h>
5,条件编译
(1) 概念:条件编译是指符g2524条件g4613编译,不符g2524条件g4613不编译。
(2) 格式,#ifdef g7643g16794符
{ 程序段1 }
# else
{ 程序段2 }
# endif
还有另g3818两种格式,g1114g16311即可。
(3) g8892g5859区分:条件编译和g17885g6333结g7512;g1120g13785g2469g10995的g19466g8585不g2528。
g17885g6333结g7512内容,全部编译,到g17828行时,g7693g6466条件是g2554成g12447g1927定g17828行g2750一g8585代g11733。
条件编译内容,不是全部编译,g7693g6466条件是g2554成g12447g1927定编译g2750一g8585代g11733。
g8892g5859区分:条件编译和函数调用。
基础训练(A)
一、g3647g12366g20076
1,C语言中有三种预处理命令:____________、____________、__________________。
2,预处理命令均以_______符号开头;
3,文件包含有g2750两种格式:__________________________。
____________________________。
4,定义宏的g1863g19202字是__________________。
5,宏定义分为___________的宏定义和_____________的宏定义。
6,预处理命令不是C语g2489,不g5529在行g7423g2164___________。
7,要使用strcpy()函数,g19668要在使用前包含_________________文件。
要使用sqrt(),fabs()函数,g19668要在使用前包含_________________文件。
g1120、g17885g6333g20076
1,以g991g8503g11842的g6563g17860是( )。
A) C语言的预处理g2163g14033是指g4448成宏替换和包含文件的调用
B) 预处理指令g2494g14033g1313g1122C源程序文件的g20330部
C) g1973是C源程序中行g20330以”#”g7643g16794的g6523g2058行都是预处理指令
C语言程序设计上机指导与同步训练
·226·
·226·
D) C语言的编译预处理g4613是g4557源程序进行g2033g8505的语g8873g7828查
2,C语言的编译系统g4557宏命令的处理时( )。
A) 在程序g17828行时进行的
B) 在程序g17842g6521时进行的
C) 和C程序中的g1866g1194语g2489g2528时进行编译的
D) 在g4557源程序中g1866g1194成分g8503式编译g1055前进行的
3,在g256文件包含g257预处理语g2489的使用g5430式中,当#includeg2530g19766的文件名用< >(尖括号)
括g17227时,找寻g15999包含文件的g7053式是( )。
A) g1177g6640g13046当前目录
B) g1177g6640g13046源程序所在目录
C) g6365系统g16786定的g7643g1946g7053式g6640g13046目录
D) 先在源程序所在目录g6640g13046,g1889g6365g10043系统g16786定的g7643g1946g7053式g6640g13046
4,在g256文件包含g257预处理语g2489的使用g5430式中,当#include g2530g19766的文件名用,”(g2464括号)
括g17227时,找寻g15999包含文件的g7053式是( )。
A) g1177g6640g13046当前目录
B) g1177g6640g13046源程序所在目录
C) g11464g6521g6365系统g16786定的g7643g1946g7053式g6640g13046目录
D) 先在源程序所在目录g6640g13046,g1889g6365g10043系统g16786定的g7643g1946g7053式g6640g13046
三、g19394g12584g20076
文件包含中两种格式的区别是g1172g1052g731
能力提高(B)
一、g3647g12366g20076
1,若有宏定义如g991,
#define X 5
#define Y X+1
#define Z Y*X/2
g2029执行以g991printf语g2489g2530,g17767g1998结果是_______。
int a;
a=Y;
printf(“%d\n”,Z);
printf(“%d\n”,--a);
2,g16843g16847程序,写g1998g17767g1998结果是:______________。
#include <stdio.h>
#define MUL(x,y) (x)*y
main()
{ int a=3,b=4,c;
c=MUL(a+1,b+2);
printf(“%d\n”,c);
}
第二部分 C语言程序设计同步训练
·227·
·227·
3,以g991程序在宏展开g2530,g17183g1552语g2489s的g5430式是______________。
#define R 3.0
#define PI 3.14159
main()
{ float s;
s=PI * R * R ;
printf(,s=%f\n”,s);
}
4,以g991程序的g17767g1998结果是__________。
#define DEBUG
main()
{int a=14,b=15,c;
c=a/b;
#ifdef DEBUG
printf(“a=%d,b=%d,”,a,b);
#endif
printf(“c=%d\n”,c);
}
g1120、g17885g6333g20076
1,以g991程序的g17828行结果是( )。
#define MIN(x,y) (x)<(y)?(x):(y)
main()
{ int i=10,j=15,k;
k=10*MIN(i,j);
printf(“%d\n”,k);
}
A) 10 g3g3B)g3 15 g3g3g3C)g3g3100 g3g3D)g3g3150
2,程序g8585,
#define A 3
#define B(a) ((A+1)*a)

x=3*(A+B(7));
g8503g11842的g2040g7041是( )。
A) 程序g19181g16835,不g16780g4896g3883宏定义
B) x=93
C) x=21
D) 程序g19181g16835,宏定义不g16780有参数
3,以g991程序g8585中存在g19181g16835的是( )。
A) #define array_size 100
int array[array_size];
B) #define PI 3.1415926
#define S(r) PI*(r)*(r)

C语言程序设计上机指导与同步训练
·228·
·228·
area= S(3.2);
C) #define PI 3.1415926
#define S(r) PI*(r)*(r)

area= S(a+b);
D) #define PI 3.1415926
#define S (r) PI*(r)*(r)

area= S(a);
4,以g991在g1231g1321g5785g1929g991g16757g12651g5191g7053数时都不g1262g5353g17227g1120义g5627的宏定义是( )。
A) #define POWER(x) x*x
B) #define POWER(x) (x)* x
C) #define POWER(x) (x*x)
D) #define POWER(x) ((x)*(x))
三、编程g20076
1,g16843分g7524一g991一g13464宏所定义的g17767g1998格式,
#define NL putchar(‘\n’)
#define PR(value) printf(“value=%d \t”,(value))
#define PRTINT1(x1) PR(x1); NL
#define PRTINT2(x1,x2) PR(x1); PRTINT1(x2)
如果在程序中有以g991的宏g5353用,
PR(x);
PRINT1( x);
PRINT2(x1,x2);
写g1998宏展开g2530的g5785g1929,g5194写g1998g5224g17767g1998的结果,g16786x=12,x1=9,x2=38,
2,编程,g7693g6466g17767g1849g2334g5464r,分别g8726g3290的g19766g12227g751,g2620g19283g744,用带参宏g4466g10628,g5194g17767g1998结果。
链接二级考试
一、g17885g6333g20076
1,g991列程序执行g2530的g17767g1998结果是( )。
A) 6 B) 8 C) 10 D) 12
#define MA(x) x*(x-1)
main()
{ int a=1,b=2; printf("%d \n",MA(1+a+b));}
(2000年4月)
2,以g991程序的g17767g1998结果是( )。
A) 16 B) 2 C) 9 D) 1
#define SQR(X) X*X
main()
{ int a=16,k=2,m=1;
a/=SQR(k+m)/SQR(k+m);
第二部分 C语言程序设计同步训练
·229·
·229·
printf(“d\n”,a);
}
(2001年4月)
3,程序中头文件typel.h 的内容是,
#define N 5
#define M1 N*3
程序如g991,
#define,type1.h”
#define M2 N*2
main()
{ int i;
i=M1+M2; printf(“%d\n”,i);
}
程序编译g2530g17828行的g17767g1998结果是:( )。
A) 10 z B) 20 C) 25 D) 30
(2002年9月)
4,g16843g16847程序,
#include <stdio.h>
#define SUB(X,Y) (X)*Y
main()
{ int a=3,b=4;
printf("%d",SUB(a++,b++));
}
上g19766程序的g17767g1998结果是( )。
A) 12 B) 15 C) 16 D) 20
(1996年4月)
g1120、g3647g12366g20076
1,g16786有如g991宏定义
#define MYSWAP(z,x,y) {z=x; x=y; y=z;}
以g991程序g8585通过宏调用g4466g10628变量a、b内容交换,g16843g3647g12366。
float a=5,b=16,c;
MYSWAP( ____________,a,b);
(1996年4月)
2,以g991程序的g17767g1998结果是 。
#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);
}
(2000年9月)