宏和函数的优缺点
程序员文章站
2024-03-21 13:23:10
...
#define RESET(p, len) while(len >0) ((char *)p)[--len] =0
#define ADD(a,b) a+b
#define MUL(a,b) a*b
#define _MIN_(a,b) ((a)<(b) ? (a):(b))
#define MALLOC(type,n) (type*)malloc(n*sizeof(type))
#include <stdio.h>
/*
宏是由预处理直接替换展开的,编译器不知道宏的存在
函数是由编译器直接编译编译的实体,调用行为由编译器决定
多次使用宏会导致程序代码量增加
函数是跳转执行的,因此代码量不会增加
宏的效率比函数高,因为是直接展开,无调用开销
函数调用时会创建活动记录,效率不如宏
宏的副作用
宏的效率比函数高,但是其副作用巨大,容易出错
宏的优点
宏的参数可以是任何C语言实体
宏的参数可以是任意的
宏编写的_MIN_参数可以是int,float等等
宏的参数可以是类型名
*/
void reset(void* p, int len)
{
while (len>0)
{
((char*)p)[--len] = 0;
}
}
int main7()
{
int array[] = {1,2,3,4,5};
int len = sizeof(array);
int i =0 ;
for (i = 0;i < 5;i++)
{
printf("%d", array[i]);
}
printf("\n");
//reset(array, len);
RESET(array, len);
for (i = 0;i < 5;i++)
{
printf("%d", array[i]);
}
return 0;
}
int main77()
{
int i = 1;
int j = 10;
printf("%d\n", MUL((ADD(1, 2)), ADD(3, 4))); //printf("%d\n", (1 +2)*3 +4); 从这里可以看到宏的缺点,不太符合用户的直观思维方式
printf("%d\n", _MIN_(i++,j)); //printf("%d\n", ((i++) < (j) ? (i++) : (j)));
return 0;
}
int main()
{
int* p = MALLOC(int, 5);//宏的优势体现的很好,可以直接传递int这种参数
}