内容正文:
第8章 编译预处理
C语言技能教程
第 八章
8.1 技能1:掌握宏定义的使用
8.2 技能2:读懂含有包含文件的程序
8.3 技能3:读懂含有条件编译的程序
C语言技能教程
8.1 技能1
【知识点】
1. 预处理命令#define定义了一个标识符,并在每次出现标识符时用一个字符串去代替它。这个标识符称为“宏名”。而替换过程称为“宏代换”或“宏展开”。
2. 宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。在C语言中,“宏”分为有参数和无参数两种。
3. 无参宏的宏名后不带参数。其定义的一般形式为:
#define 标识符 字符串
8.1.1 不带参数的宏定义
C语言技能教程
8.1 技能1
【典型例题】
例8.1 写出下面程序段的运行结果。
#define M (2*y+3)
main(){
int z,y;
printf("请输入一个数: ");
scanf("%d",&y);
z=2*M*M +5*M+1;
printf("z=%d
",z);
}
8.1.1 不带参数的宏定义
C语言技能教程
8.1 技能1
【典型例题】
例8.2 写出下面程序段的运行结果。
#define PI 3.14159
#define R 2.0
#define S PI*R*R
main()
{float z;
z=3*S*S;
printf("z=%f
",z);
}
8.1.1 不带参数的宏定义
C语言技能教程
8.1 技能1
【典型例题】
例8.3 写出下面程序段的运行结果。
#define P printf
#define D "%d
"
#define F "%f
"
main()
{ int a=1, b=2, c=3;
float d=1.5, e=2.6, f=3.7;
P(D F,a,d);
P(D F,b,e);
P(D F,c,f);
}
8.1.1 不带参数的宏定义
C语言技能教程
8.1 技能1
【点拨】
8.1.1 不带参数的宏定义
1. 宏代换就是一种简单的代换,宏定义用宏名表示一个字符串,在宏展开时用这个字符串取代宏名,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查,因此如果有错误,只能在编译已经宏展开后的源程序时发现。
2. 在源程序中如果宏名用引号括起来,那么预处理程序则不对其作宏代换。
3. 宏定义允许嵌套,已经定义的宏名可以在宏定义的字符串中使用。由预处理程序在宏展开时层层代换。
C语言技能教程
8.1 技能1
【点拨】
8.1.1 不带参数的宏定义
4. 一般宏名用大写字母表示,以利于同变量区别,但也可以用小写字母表示。
5. 数据类型也可用宏定义来表示,使书写方便,但在使用时要小心,以免出错。
6. 宏定义不是说明,也不是语句,在行末不加分号。如果加上分号,则连分号也一起置换。
7. 宏定义必须写在函数的外面,其作用范围为从宏定义命令开始到当前源程序结束。
8. 如果对“输出格式”作宏定义,则可以减少书写麻烦。
C语言技能教程
8.1 技能1
【知识点】
1. 在C语言中允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏,在调用时,不仅宏展开,而且用实际参数去代换形式参数。
2. 带参宏定义的一般形式为:
#define 宏名(形参表) 字符串
在字符串中含有各个形参。带参宏调用的一般形式为:
宏名(实参表);
8.1.2 带参数的宏定义
C语言技能教程
8.1 技能1
【典型例题】
例8.5 输入任意二个整数,输出最大值。
#define MAX(a,b) (a>b)?a:b
main()
{
int x,y,max;
printf("请输入二个数");
scanf("%d%d",&x,&y);
max=MAX(x,y);
printf("max=%d
",max);
}
8.1.2 带参数的宏定义
C语言技能教程
8.1 技能1
【典型例题】
例8.6 计算x+1的平方值。
#define SQ(y) (y)*(y)
main()
{
int x,sq;
printf("请输入一个数:");
scanf("%d",&x);
sq=SQ(x+1);
printf("sq=%d
",sq);
}
8.1.2 带参数的宏定义
C语言技能教程
8.1 技能1
【点拨】
1. 宏定义中的字符串内的形参通常要用括号括起来,以免出错。不但应该在参数的两侧加上括号,还应该在整个字符串外加括号。
2.在宏调用中的实参可以是表达式,而宏定义中的形参仅仅是标识符。
3. 在带参宏