宏总结

17 篇文章 0 订阅
15 篇文章 0 订阅

宏即代码替换,它可以替换数值字面值常量,字符串等非整型以及函数替换。如:

#define MAX 1024   
#define STRING "stringstring"
#define SWAP(a,b) {a=a+b;b=a-b;a=a-b}

1.宏的执行速度较快,一个程序到执行经过四个步骤,预处理、编译、汇编、链接,而宏则在预处理阶段已经将其代表的代码替换到程序中了;

对于函数每次执行都需要调用、返回的额外开销,速度较慢一些;

2.从代码长度上,因为在每次使用时,宏代码都被插入到程序当中,所以程序的长度有时会大幅度增加,所以宏一般应该代表长度较小的代码;

函数代码只出现在一个地方,每次使用这个函数时,都调用此地方的同一份代码;

3.从参数类型上,在以上举例中宏参数并没有指定类型,所以它是与类型无关的,即无论传什么类型的参数它都可以接收执行,所以它也是不安全的;

函数参数必定定义类型,传递什么类型参数调用什么类型函数;

4.对与宏的参数,它可以传类型,因为它只是做替换,如下:type为一个类型,用于动态开辟内存

#define MALLOC(n,type) ((type*)malloc((n)*sizeof(type)))
函数参数则不可以传递类型;

5.宏参数具有副作用,当一个参数经过多次运算以后,将产生不同的结果,如传入有自增、自加运算符的参数,就会带来副作用,如:

#define Max(a,b) ((a)>(b)?(a):(b))
...
x=5;y=8;
z=MAX(x++,y++);

//替换:((x++)>(y++)?(x++):(y++))
//结果为:x=6,y=10,z=9

较大的y值增了两次;

函数的参数被调用前只求值一次,不会造成问题;

6.宏要注意操作符优先级,在写宏表达式要注意都要加上括号,否则操作符优先级严重影响运算结果,如:

#define SUB(x) x*x
...
a=5;
b=SUB(a+1);
//结果:b=13   希望结果:b=36
函数参数在调用时已经求值,将值结果传入函数,不会造成如宏一般的优先级问题。

宏还要注意:

当一个文件中出现了两个同名的宏,如:

#define A 5
#define A 6
...
cout<<A<<endl;
//结果:6
编译器会发出警告,但会选择最后一次宏定义来替换它,可以例比为变量的第二次赋值。






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值