宏总结

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

#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
编译器会发出警告,但会选择最后一次宏定义来替换它,可以例比为变量的第二次赋值。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章