每日一学17
本帖最后由 6bingame 于 2024-12-13 19:39 编辑编译于预处理指令2
宏定义嵌套
和变量定义一样,宏也是可以嵌套定义的。
例如:
#define A (1+2)
#define B A*A
#define C B+B
我们先定义了A,然后定义B,最后又定义了C,环环相套,次序不能颠倒。
宏展开后如下:
#define A (1+2)
#define B (1+2)*(1+2)
#define C (1+2)*(1+2)+(1+2)*(1+2)
例题1:已知重力加速是9.8,运行时间是2秒,使用变量式宏定义嵌套,求运行速度和运动距离。
#include<stdio.h>
#define A 9.8 //定义宏A
#define B 2 //定义宏B
#define V A*B //嵌套定义宏V
#define S 0.5*A*B*B //嵌套定义宏S
int main()
{
printf("匀加速度是:%f\n",A);
printf("运行时间是:%ds\n",B);
printf("经过计算,速度是:%f\n",V);
printf("经过计算,运动距离是:%f\n",S);
return 0;
}
例题分析:
本范例使用了宏的嵌套定义,在定义了A和B之后,定义的V和S就利用了A和B的值。
宏定义嵌套展开:
#define V 9.8*2
#define S 0.5*9.8*2*2
然后把宏展开,对源代码进行编译,从而输出结果。
宏定义范围
文件中的宏定义并非是从定义就有效到文件结束,我们可以圈定宏定义的作用范围,使用的方法是:
#define //宏定义开始
...... //宏定义范围
#undef //宏定义结束
例题2:练习使用宏定义范围
#include<stdio.h>
#define A 2 //宏定义开始
void function();
int main()
{
printf("调用fun函数前宏A的值是:%d\n",A);
function();
printf("调用fun函数后宏A的值是:%d\n",A);
}
#undef A //宏定义结束
#define A 12 //宏定义开始
void function()
{
printf("fun函数中宏A的值是:%d\n",A);
}
#undef A //宏定义结束
例题分析:本范例两次使用A作为宏名,进行了宏定义,这两次各圈定了自己的范围。从输出结果可以看出,当我们界定了宏定义的范围后,即使是同一个宏名,它的值也是不同的。
函数式宏定义
函数式宏定义的一般形式为:
#define 标识符 (参数列表)字符串
字符串包含标识符中的参数,参数列表可有一个或者多个参数组成。因为外观先调用含义一样,所以称之为函数式宏定义,也可以称为带参数的宏定义。
例题3:使用函数式宏定义求解圆周长和圆面积。
#include<stdio.h>
#define PI 3.1415926 //变量式宏定义
#define C(r) 2*PI*r //函数式宏定义,一个参数
#define S(r) PI*r*r //函数式宏定义,一个参数
int main()
{
int radius;
printf("请输入圆半径:");
scanf("%d",&radius);
printf("圆的周长是:%f\n",C(radius)); //使用宏定义
printf("圆的面积是:%f\n",S(radius));
return 0;
}
例题分析:
本范例的代码更为简洁,直接对周长和面积公式使用了宏定义的形式。
例题4:使用函数式宏定义求两个数中的最大值和两个数的乘积。
#include<stdio.h>
#define MAX(a,b)a>b?a:b
#define MUL(a,b)(a*b) //函数式宏定义,两个参数
int main()
{
int x,y;
printf("请输入x和y的值\n");
scanf("%d %d",&x,&y);
printf("max(%d,%d)=%d\n",x,y,MAX(x,y));
printf("mul(%d,%d)=%d\n",x,y,MUL(x,y)); //使用宏定义
return 0;
}
例题分析:
本范例定义了一个取两个数最大值的宏,结果也是正确的,似乎没有问题产生,其实暗藏着玄机。
把代码修改如下,再来运行。
#include<stdio.h>
#define MAX(a,b)a>b?a:b
#define MUL(a,b)(a*b)
int main()
{
int a,b,c,d;
printf("请输入a,b,c,d的值\n");
scanf("%d %d %d %d",&a,&b,&c,&d);
printf("max(%d,%d)=%d\n",a+b,c+d,MAX(a+b,c+d));
printf("mul(%d,%d)=%d\n",a+b,c+d,MUL(a+b,c+d));
return 0;
}
多行宏定义
通常宏定义必须是单行的,但是我们也可以使用多行来定义一个宏,定义的方法就是使用反斜杠"\"。
例如:
#define mim(x,y)\ //多行宏定义开始
((x)<(y)?(x):(y)) //多行宏定义结束
这个指令写在两行中,第2行为了美观,插入了一些空白符,使用的是空格。但是需要注意的是,第1行的反斜杠"\"必须放在该行的结尾,也就是输入了"\"后,紧接着的就是回车。
例题5:多行宏定义示例
#include<stdio.h>
#define exchange(a,b){\
int t;\
t=a;\
a=b;\
b=t;}
int main()
{
int x=10;
int y=20;
printf("x=%d;y=%d\n",x,y);
exchange(x,y); //使用宏定义
printf("x=%d;y=%d\n",x,y);
return 0;
}
例题分析:
本范例展示了如何使用多行宏定义。多行宏定义虽然不太常用,但遇见时大家应该认识并理解,特别是”\“的后面必须紧跟回车符。
页:
[1]