预处理命令-宏定义

宏定义注意点: 

  • 宏名一般习惯用大写字母表示
  • 使用宏可以减少再程序中重复书写某些繁琐字符的工作量,避免不必要的错误
  • 宏定义只是简单地替换,不做正确性检查
  • 宏定义末尾不能加分号
  • 宏定义的有效范围是,宏定义之后到本源文件结束
  • 宏定义可以引用已经定义的宏,层层替换
  • 程序中在""中的字符即使与宏名相同也不进行替换
  • 宏定义只做字符替换,不分配内存
  • 宏替换不占用运行时间,只占用编译时间

    

宏定义的一般格式:

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

    

 带参的宏定义:

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

    

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

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

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

    

 以下是两个宏的例子:

    

    用宏定义一年中有多少秒

    #define SECONDINAYEAR (365*24*60*60)          //注意,这里不能加分号

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

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

    #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,数组中第一个元素

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

 宏定义不要主观的给它加括号,一定要原样替换,例如:

#include f(a,b,x)  a*x+b

printf("%d,%d\n",f(3,2,1),f(6,5,f(3,2,1)));       //输出结果为5,25  而不是5,35,问题一般出在第二个结果25

//f(6,5,f(3,2,1))原样替换为:a*a*x+b+b,带入数值为6*3*1+2+5=25,一定不要想当然的给f(3,2,1)加括号优先计算

 

点击原博文地址,我稍加修改添加了一下。

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值