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

    程序的运行结果为:OK 这表示把“OK”当字符串处理。

    5) 宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预

    处理程序层层代换。

    例如:

    #define PI 3.1415926

    #define S PI*y*y          /* PI 是已定义的宏名*/

    对语句:

    printf("%f",S);

    在宏代换后变为:

    printf("%f",3.1415926*y*y);

    6) 习惯上宏名用大写字母表示,以便于与变量区别。但也允许用小写字母。

    7) 可用宏定义表示数据类型,使书写方便。

    例如:

    #define STU struct stu

    在程序中可用 STU 作变量说明:

    STU body[5],*p;

    #define INTEGER int

    在程序中即可用 INTEGER 作整型变量说明:

    INTEGER a,b;

    应注意用宏定义表示数据类型和用 typedef 定义数据说明符的区别。

    宏定义只是简单的字符串代换,是在预处理完成的,而 typedef 是在编译时处理的,它

    不是作简单的代换,而是对类型说明符重新命名。被命名的标识符具有类型定义说明的功能。

    请看下面的例子:

    #define PIN1 int *

    typedef (int *) PIN2;

    从形式上看这两者相似, 但在实际使用中却不相同。

    下面用 PIN1,PIN2 说明变量时就可以看出它们的区别:

    PIN1 a,b;在宏代换后变成:

    int *a,b;

    表示 a 是指向整型的指针变量,而 b 是整型变量。

    然而:

    PIN2 a,b;

    表示 a,b 都是指向整型的指针变量。因为 PIN2 是一个类型说明符。由这个例子可见,宏定义

    虽然也可表示数据类型, 但毕竟是作字符代换。在使用时要分外小心,以避出错。

    8) 对“输出格式”作宏定义,可以减少书写麻烦。

    【例 9.3】中就采用了这种方法。

    #define P printf

    #define D "%d\n"

    #define F "%f\n"

    main(){

    int a=5, c=8, e=11;

    float b=3.8, d=9.7, f=21.08;

    P(D F,a,b);

    P(D F,c,d);

    P(D F,e,f);

    }

    9.2.2 带参宏定义

    C语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际

    参数。

    对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。

    带参宏定义的一般形式为:

    #define  宏名(形参表)  字符串

    在字符串中含有各个形参。

    带参宏调用的一般形式为:

    宏名(实参表);

   
上一页 目录 下一页