内联函数与预处理宏内联函数与预处理宏有何不同?
3 回答
喵喔喔
TA贡献1735条经验 获得超5个赞
宏不是类型安全的,无论它们是否同步正确,都可以展开它们-编译阶段将报告由宏展开问题造成的错误。 宏可以在您不期望的上下文中使用,从而导致问题 宏更灵活,因为它们可以扩展其他宏,而内联函数并不一定这样做。 宏可能会产生副作用,因为它们的扩展,因为输入表达式被复制到模式中的任何位置。 内联函数并不总是被保证是内联的-有些编译器只在发布版本中或者当它们被专门配置这样做时才会这样做。此外,在某些情况下,内联可能是不可能的。 内联函数可以为变量(特别是静态变量)提供范围,预处理宏只能在代码块{.}中这样做,而静态变量的行为方式并不完全相同。
Cats萌萌
TA贡献1805条经验 获得超9个赞
#define max(a,b) ((a<b)?b:a)
max(a++,b++)
a
b
inline int max( int a, int b) { return ((a<b)?b:a); }
holdtom
TA贡献1805条经验 获得超10个赞
在宏调用期间不进行类型检查,而在函数调用期间进行类型检查。 由于重新评估参数和操作顺序,在宏扩展过程中可能会出现不期望的结果和效率低下。例如 #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`
返回关键字不能像函数那样在宏中使用来返回值。 内联函数可以重载。 传递给宏的令牌可以使用操作符#称为令牌粘贴操作符连接起来。 宏通常用于代码重用,其中作为内联函数用于消除函数调用期间的时间开销(多余时间)(避免跳转到子例程)。
- 3 回答
- 0 关注
- 462 浏览
添加回答
举报
0/150
提交
取消