一、代码长度
#define定义宏:每次用到 #define 时,对应的代码会插入的程序中,如果#define定义宏的代码比较长,就会导致插入后的程序长度大幅度增长;
函数:函数的代码只出现一次,每次使用这个函数就调动就行。
二、执行的速度
#define定义宏:速度更快,因为在预编译阶段就已经完成了替换;
函数:存在函数的额外调用和返回值的额外开销,速度相对于慢一些。
三、操作符优先级
#define定义宏:需要提前加好括号,否则可能有未知的错误,例如
#define DOUBLE(x) x+x
int a=5;
printf("%d",10*DOUBLE(a));
答案是:10*5+5=55.
函数:就不会出现类似#define定义宏的未知错误。
四、参数类型:
#define定义宏:可以参与任何类型的计算,例如:
#define MAX(X,Y) ((X)>(Y)?(X):(Y))
它可以参与任何类型的计算,如float、int、short等等
函数:它就不能参与任何类型的计算,是什么类型就只是参与什么类型,除非强制类型转换,因此凭借这点来说,#define在这仿麦呢方便很多
五、调试
#define定义宏:不能调试,因为宏的替换发生在预编译阶段;
函数:可以调试,且能够逐语句调试,当代码出现bug时,能够分析出原因在哪里。
六、递归
#define定义宏:不能递归;
函数:可以递归。