内联函数与预处理宏

内联函数与预处理宏

内联函数与预处理宏有何不同?



撒科打诨
浏览 463回答 3
3回答

喵喔喔

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

Cats萌萌

首先,预处理器宏只是编译前的代码中的“复制粘贴”。所以没有类型检查,还有一些副作用会出现例如,如果要比较2个值:#define&nbsp;max(a,b)&nbsp;((a<b)?b:a)如果使用max(a++,b++)例如(a或b将增加两次)。相反,使用(例如)inline&nbsp;int&nbsp;max(&nbsp;int&nbsp;a,&nbsp;int&nbsp;b)&nbsp;{&nbsp;return&nbsp;((a<b)?b:a);&nbsp;}

holdtom

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