宏常量概念:
用#define指令,指定用一个符号名称代表一个常量;也称为符号常量。
例如:#define PI 3.1415 //注意行末没有分号
经过上述的指定后,本文件中从此行开始所有的PI都代表3.1415。在对程序进行编译前,预处理器先对PI进行宏展开,把所有的PI都替换成3.1415。这种用一个符号代表一个常量的,称为宏常量;
使用宏常量的好处:
- 含义清楚;看程序时从PI就可大致知道他代表圆周率。故应尽量使用“见名知意”的变量名或符号常量;
- 在需要修改程序中多处用到的同一个常量时,能做到一改全改;
注意事项:要区分宏常量和变量,不要把宏常量误认为变量。符号常量不占用内存,只是一个临时符号,代表一个值,在预处理后这个符号就不存在了,故不能对符号常量解析值。为和变量名区别开,习惯上符号常量用大写字母表示;
#include<stdio.h>
#define PI 3.1415
int main()
{
int a = PI;
printf("%f\n", a);
return 0;
}
宏函数概念:
- 宏函数和宏常量都是利用#define定义出来的内容
- 在项目中,经常把一些短小而又频繁使用的函数写成宏函数
- 这是由于宏函数没有普通函数参数压栈、跳转、出栈返回等时间上的开销,可以调高程序的效率。
注意事项: 宏函数通常需要加括号,保证运算的完整;宏函数不是真正的函数,是一种替换机制,所以操作符的优先级会影响宏的求值, 应尽量使用括号明确优先级
#define MYADD(x,y) ((x) + (y)) //宏函数
//普通函数下的a、b都要进行入栈,函数执行后出栈
int myAdd(int a ,int b)//普通函数
{
return a + b;
}
//宏函数 在一定的场景下 要比普通的函数效率高,把频繁使用并且短小的函数 可以写成宏函数
//宏函数在编译阶段就替换源码 而没有普通函数入栈出栈的开销,以空间换时间
void test()
{
int a = 10;
int b = 20;
printf("a + b = %d\n", MYADD(a, b)); // 直接替换((a) + (b))
}
总结:将使用频繁且短小的函数可以封装为宏函数,以空间换时间。