宏与函数各自优缺点
宏优于函数
- 类型无关:在宏定义时,不需要先为内容确定类型。函数则必须为参数、返回值声明类型。
- 规模、速度更胜一筹:因为宏的内容不需要像函数般占据内存,在工程很庞大时,这点会很明显。而且在工程很小的情况下,调用函数和从函数返回的代码可能比实际执行这个小型计算工作所需要的时间更短。
- 传递类型作为参数:
(范例引用于网络图片)
函数优于宏
- 代码较短:每次使用宏,就会有一份宏定义的代码插入程序,除非宏比较短,否则可能大幅度增加代码长度。
- 宏在使用后无法调试,而函数可以调试易于找出错误。
- 类型无关:因为类型无关,编译器只对其进行字符替换的时候,没有类型安全检查,并且在字符替换是可能产生意料不到的错误(边际效应)。
- 宏在使用时可能带来运算符优先级带来的错误。
- 当宏参数在宏定义中出现超过一次时,如果参数本身会有类似自增自减之类的将引起自身改变的情况,可能会带来不可预测的结果。
- 宏通常只用来写简单运算,而函数可以进行复杂的运算。
附:
宏进行字符替换时是真的只进行替换,没有进行自行计算。。
因此在使用时不要吝于使用括号。。
例:
#define SQUARE(x) x*x
...
SQUARE(3+1);
//替换为 3+1*3+1 并非 看起来的(3+1)*(3+1)
//因此想要得到后者所示结果应写成 #define SQUARE(x) (x)*(x)