宏定义(函数)与函数的场景取舍
- 宏定义(函数)适合使用较短的代码即可完成的功能。函数适用于比较长的代码或者需要出现在程序的不同文件之中。
- 宏定义(函数)的开销相比函数来说较小,函数的调用会借助堆栈,而宏定义(函数)是在编译阶段替换对应名称的调用。
- 函数在声明形式参数时必须注明参数类型,而宏定义(函数)可以将参数类型作为参数传递给对应的宏定义(函数)。
- 函数如果需要可以支持不同参数类型的功能,则必须实现重载函数。而宏定义(函数)不需要。也就是说,宏定义(函数)与类型无关。
下面是实现如何通过宏定义函数来实现不同数值类型的取值范围
需要注意如果需要代码成功运行,需要删除宏定义函数里面的注释
#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())