宏定义

宏定义(函数)与函数的场景取舍

  1. 宏定义(函数)适合使用较短的代码即可完成的功能。函数适用于比较长的代码或者需要出现在程序的不同文件之中。
  2. 宏定义(函数)的开销相比函数来说较小,函数的调用会借助堆栈,而宏定义(函数)是在编译阶段替换对应名称的调用。
  3. 函数在声明形式参数时必须注明参数类型,而宏定义(函数)可以将参数类型作为参数传递给对应的宏定义(函数)。
  4. 函数如果需要可以支持不同参数类型的功能,则必须实现重载函数。而宏定义(函数)不需要。也就是说,宏定义(函数)与类型无关。

下面是实现如何通过宏定义函数来实现不同数值类型的取值范围

需要注意如果需要代码成功运行,需要删除宏定义函数里面的注释

#include <stdio.h>
//判断是不是无符号数
//宏定义函数每一行后面需要加上'\'符号,否则所有代码全部写在同一行
#define RANGE(type) if ((type)((type)0-1)>0){\
//无符号数输出范围
    type m=0;m=m-1;printf("%s:[%.0f %.0f]\n",#type,(double)0,(double)m);\
}else{\
    double c=(1<<(sizeof(type)*8-1));\
    printf("nihao2!\n");printf("%s:[%.0f %.0f]\n",#type,(double)c*-1,(double)c-1);\
}

int main()
{
    RANGE(int);//输出:"   int:[2147483648,-2147483649] "
    return 0;
}

简化函数的参数的表示

#define All(x) x.begin(),x.end();
#define INS(x) inserter(x,x.begin())

set_union(All(x1),All(x2),INS(x));
//直接替换成
//set_union(x1.begin(),x1.end(),x2.begin(),x2.begin(),inserter(x,x.begin()));

个人见解:

宏定义在我认为就可以看成是操作系统中的"立即数"
在编译器生成目标文件前直接将空格前的宏(例如All(x) )替换为空格后的宏(例如x.begin(),x.end())。
()里面的变量也是名字的替换(例如All(x1)会替换成x1.begin(),x1.end())


参考C语言宏定义和宏定义函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值