字体
第(4/6)页
关灯
   存书签 书架管理 返回目录
 例如:

    #define M(y) y*y+3*y      /*宏定义*/

    ……

    k=M(5);                   /*宏调用*/

    ……

    在宏调用时,用实参 5 去代替形参 y,经预处理宏展开后的语句为:

    k=5*5+3*5

    【例 9.4】

    #define MAX(a,b) (a>b)?a:b

    main(){

    int x,y,max;

    printf("input two numbers:    ");

    scanf("%d%d",&x,&y);

    max=MAX(x,y);

    printf("max=%d\n",max);

    }

    上例程序的第一行进行带参宏定义,用宏名 MAX 表示条件表达式(a>b)?a:b,形参 a,b

    均出现在条件表达式中。程序第七行 max=MAX(x,y)为宏调用,实参 x,y,将代换形参 a,b。

    宏展开后该语句为:

    max=(x>y)?x:y;

    用于计算 x,y 中的大数。

    对于带参的宏定义有以下问题需要说明:

    1. 带参宏定义中,宏名和形参表之间不能有空格出现。

    例如把:

    #define MAX(a,b) (a>b)?a:b

    写为:

    #define MAX  (a,b)  (a>b)?a:b

    将被认为是无参宏定义,宏名 MAX 代表字符串 (a,b) (a>b)?a:b。宏展开时,宏调用语

    句:

    max=MAX(x,y);

    将变为:

    max=(a,b)(a>b)?a:b(x,y);

    这显然是错误的。

    2. 在带参宏定义中,形式参数不分配内存单元,因此不必作类型定义。而宏调用中的实参有

    具体的值。要用它们去代换形参,因此必须作类型说明。这是与函数中的情况不同的。在函

    数中,形参和实参是两个不同的量,各有自己的作用域,调用时要把实参值赋予形参,进行

    “值传递”。而在带参宏中,只是符号代换,不存在值传递的问题。

    3. 在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。

    【例 9.5】

    #define SQ(y) (y)*(y)

    main(){

    int a,sq;

    printf("input a number:    ");

    scanf("%d",&a);

    sq=SQ(a+1);

    printf("sq=%d\n",sq);

    }

    上例中第一行为宏定义,形参为 y。程序第七行宏调用中实参为 a+1,是一个表达式,在

    宏展开时,用 a+1 代换 y,再用(y)*(y) 代换 SQ,得到如下语句:

    sq=(a+1)*(a+1);

    这与函数的调用是不同的,函数调用时要把实参表达式的值求出来再赋予形参。而宏代

    换中对实参表达式不作计算直接地照原样代换。

    4. 在宏定义中,字符串内的形参通常要用括号括起来
上一页 目录 下一页