先来看一组代码
要求在两个数中找出较大的一个
可以看出对于函数来说,如果这两个数类型变了,就需要重新声明和实现函数,而宏与类型无关,不受影响。
float Max2(float x, float y)
{
return (x > y ? x : y);
}
//int Max(int x, int y)
//{
// return (x > y ? x : y);
//}
#define MAX(X, Y) ((X)>(Y)?(X):(Y))
int main()
{
int a = 10;
int b = 20;
//int max = Max(a, b);
//printf("max=%d\n", max);
//max = MAX(a, b);
//printf("max=%d\n", max);
float c = 3.0f;
float d = 4.0f;
float max = Max2(c, d);
printf("max=%f\n", max);
max = MAX(c, d);
printf("max=%f\n", max);
return 0;
}
宏通常被用于执行简单计算。
宏的优势:
1.宏比函数在程序的规模和速度方面更胜一筹。函数在调用的时候,会有函数调用和返回的开销;对于宏,在预处理阶段就完成了替换,没有函数的调用和返回的开销。
2.宏是与类型无关的。
宏的劣势:
1.每次使用宏的时候,一份宏定义代码就会插入到程序中,除了宏比较短,否则可能会大幅增加程序长度
2.宏没法调试
3.宏由于和类型无关,也就不够严谨
4.宏可能会带来运算符优先级的问题,导致容易出错
宏有时候可以做到函数做不到的事情
比如:宏的参数可以出现类型,但是函数不可以
#define SIZEOF(type) sizeof(type)
int main()
{
int ret = SIZEOF(int);
printf("%d\n", ret);//4
return 0;
}
#define MALLOC(num,type) (type*)malloc(num*sizeof(type))
int main()
{
int* p1 = (int*)malloc(10 * sizeof(int));
int* p2 = MALLOC(10, int);
//int*p2 =(int*)malloc(10*sizeof(int));
}