宏和函数的对比

先来看一组代码
要求在两个数中找出较大的一个
可以看出对于函数来说,如果这两个数类型变了,就需要重新声明和实现函数,而宏与类型无关,不受影响。

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));
}


命名约定
一般来讲函数和宏的使用语法很相似。所以语言本身没法帮我们区分两者。
平时书写的习惯:
把宏名全部大写,函数名不要全部大写

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值