holdtom
内联函数由编译器扩展,其中宏由预处理器展开,这只是文本替换。在宏调用期间不进行类型检查,而在函数调用期间进行类型检查。由于重新评估参数和操作顺序,在宏扩展过程中可能会出现不期望的结果和效率低下。例如#define MAX(a,b) ((a)>(b) ? (a) : (b))int i = 5, j = MAX(i++, 0);会导致int i = 5, j = ((i++)>(0) ? (i++) : (0));宏参数在宏展开之前不进行计算。#define MUL(a, b) a*bint main(){
// The macro is expended as 2 + 3 * 3 + 5, not as 5*8
printf("%d", MUL(2+3, 3+5));
return 0;}// Output: 16`返回关键字不能像函数那样在宏中使用来返回值。内联函数可以重载。传递给宏的令牌可以使用操作符#称为令牌粘贴操作符连接起来。宏通常用于代码重用,其中作为内联函数用于消除函数调用期间的时间开销(多余时间)(避免跳转到子例程)。