字体
第(2/6)页
关灯
   存书签 书架管理 返回目录
串”可以是常数、表达式、格式串等。

    在前面介绍过的符号常量的定义就是一种无参宏定义。此外,常对程序中反复使用的表

    达式进行宏定义。

    例如:

    #define M (y*y+3*y)

    它的作用是指定标识符 M 来代替表达式(y*y+3*y)。在编写源程序时,所有的(y*y+3*y)

    都可由 M 代替,而对源程序作编译时,将先由预处理程序进行宏代换,即用(y*y+3*y)表达式

    去置换所有的宏名 M,然后再进行编译。

    【例 9.1】

    #define M (y*y+3*y)

    main(){

    int s,y;

    printf("input a number:  ");

    scanf("%d",&y);

    s=3*M+4*M+5*M;

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

    }

    上例程序中首先进行宏定义,定义 M 来替代表达式(y*y+3*y),在 s=3*M+4*M+5* M 中作了

    宏调用。在预处理时经宏展开后该语句变为:

    s=3*(y*y+3*y)+4*(y*y+3*y)+5*(y*y+3*y);

    但要注意的是,在宏定义中表达式(y*y+3*y)两边的括号不能少。否则会发生错误。如当作以

    下定义后:

    #difine M y*y+3*y

    在宏展开时将得到下述语句:

    s=3*y*y+3*y+4*y*y+3*y+5*y*y+3*y;

    这相当于:

    3y2+3y+4y2+3y+5y2+3y;

    显然与原题意要求不符。计算结果当然是错误的。因此在作宏定义时必须十分注意。应保证

    在宏代换之后不发生错误。

    对于宏定义还要说明以下几点:

    1) 宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一

    种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理

    程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。

    2) 宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。

    3) 宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如要终止其作

    用域可使用# undef 命令。

    例如:

    #define PI 3.14159

    main()

    {

    ……

    }

    #undef PI

    f1()

    {

    ……

    }

    表示 PI 只在 main 函数中有效,在 f1 中无效。

    4) 宏名在源程序中若用引号括起来,则预处理程序不对其作宏代换。

    【例 9.2】

    #define OK 100

    main()

    {

    printf("OK");

    printf("\n");

    }

    上例中定义宏名 OK 表示 100,但在 printf 语句中 OK 被引号括起来,因此不作宏代换。
上一页 目录 下一页