6bingame 发表于 2024-12-13 19:39:40

每日一学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]
查看完整版本: 每日一学17