预处理命令--宏定义

/*预处理命令--宏定义*/

    //宏名一般习惯用大写字母表示

    //使用宏可以减少再程序中重复书写某些繁琐字符的工作量,避免不必要的错误

    //宏定义只是简单地替换,不做正确性检查

    //宏定义末尾不必加分号

    //宏定义的有效范围是,宏定义之后到本源文件结束

    //宏定义可以引用已经定义的宏,层层替换

    //程序中在""中的字符即使与宏名相同也不进行替换

    //宏定义只做字符替换,不分配内存

    //宏替换不占用运行时间,只占用编译时间

    

    /*宏定义的一般格式*/

    //#define 宏名 需要替换地字符串

    

    /*带参地宏定义*/

    //#define 宏名(参数表) 需要替换地字符

    

    //带参宏的展开只是将语句中的宏名后面的实参字符串代替#define命令行中的形参

    //宏名和参数表的括号之间没有空格

    //宏名无类型、参数也无类型只是一个符号代表

    

    /*以下是两个宏的列子*/

    

    //用宏定义一年中有多少秒

    #define SECONDINAYEAR (365*24*60*60)  

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

    //定义一个标准宏 MAX 表示输入两个参数XY,返回其中较大者

    

    #define MAX(A,B) ((A) > (B) ? (A) : (B))

    printf("MAX = %d\n",MAX(5, 6));

    //但是这个宏有副作用,如下

    int a[10];

    for (int i = 0; i<10; i++) {

        a[i] = i+1;

    }

    int b = 10;

    int *p = &a[0];

    int max = MAX(*p++, b);

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

    //相当于

    //max = ((*p++) >= (b) ? (*p++) : (b));//这里将指针变量p进行了一次自加,最终p指向数组中的下一元素即a[1]=2

    printf("*p = %d",*p);//在这里会输出2,数组中第一个元素

    

    //注意在使用宏时小心地使用括号

posted on 2013-11-23 23:45  IOS开发者  阅读(806)  评论(0编辑  收藏  举报