为了账号安全,请及时绑定邮箱和手机立即绑定

内联函数与预处理宏

内联函数与预处理宏

C++
哔哔one 2019-10-12 12:07:20
内联函数与预处理宏内联函数与预处理宏有何不同?
查看完整描述

3 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

预处理宏只是应用于代码的替换模式。它们几乎可以在代码中的任何地方使用,因为它们在任何编译开始之前都会被展开替换。

内联功能是将身体直接注入其呼叫站点的实际功能。它们只能在函数调用合适的情况下使用。

现在,关于在类似函数的上下文中使用宏和内联函数,建议如下:

  • 宏不是类型安全的,无论它们是否同步正确,都可以展开它们-编译阶段将报告由宏展开问题造成的错误。
  • 宏可以在您不期望的上下文中使用,从而导致问题
  • 宏更灵活,因为它们可以扩展其他宏,而内联函数并不一定这样做。
  • 宏可能会产生副作用,因为它们的扩展,因为输入表达式被复制到模式中的任何位置。
  • 内联函数并不总是被保证是内联的-有些编译器只在发布版本中或者当它们被专门配置这样做时才会这样做。此外,在某些情况下,内联可能是不可能的。
  • 内联函数可以为变量(特别是静态变量)提供范围,预处理宏只能在代码块{.}中这样做,而静态变量的行为方式并不完全相同。



查看完整回答
反对 回复 2019-10-14
?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

首先,预处理器宏只是编译前的代码中的“复制粘贴”。所以没有类型检查,还有一些副作用会出现

例如,如果要比较2个值:

#define max(a,b) ((a<b)?b:a)

如果使用max(a++,b++)例如(ab将增加两次)。相反,使用(例如)

inline int max( int a, int b) { return ((a<b)?b:a); }



查看完整回答
反对 回复 2019-10-14
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

内联函数由编译器扩展,其中宏由预处理器展开,这只是文本替换。

  • 在宏调用期间不进行类型检查,而在函数调用期间进行类型检查。

  • 由于重新评估参数和操作顺序,在宏扩展过程中可能会出现不期望的结果和效率低下。例如

    #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`
  • 返回关键字不能像函数那样在宏中使用来返回值。

  • 内联函数可以重载。

  • 传递给宏的令牌可以使用操作符#称为令牌粘贴操作符连接起来。

  • 宏通常用于代码重用,其中作为内联函数用于消除函数调用期间的时间开销(多余时间)(避免跳转到子例程)。



查看完整回答
反对 回复 2019-10-14
  • 3 回答
  • 0 关注
  • 337 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信