宏总结

来源:互联网 发布:伦敦奥运会易建联数据 编辑:程序博客网 时间:2024/06/06 07:01

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

#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