内联和#define之间的实践有什么区别?

eli*_*ego 10 c inline c-preprocessor

正如标题所说; inline关键字和#define预处理程序指令之间的区别是什么?

Pav*_*sky 42

#define是一个预处理器工具,具有宏语义.考虑一下,如果max(a,b)将宏定义为

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

例1:

val = max(100, GetBloodSample(BS_LDL))会溢出额外的无辜血液,因为这个功能实际上会被调用两次.这可能意味着实际应用程序的性能差异很大.

例2:

val = max(3, schroedingerCat.GetNumPaws()) 这表明程序逻辑存在严重差异,因为这可能会意外地返回一个小于3的数字 - 这是用户不会期望的.

例3:

val = max(x, y++)可能会增加y一次以上.


使用内联函数,这些都不会发生.

主要原因是宏观概念针对实现的透明度(文本代码替换)和内联目标正确的语言概念,使得调用语义对用户更加透明.

  • 您应该将`shroedingerCat.GetNumPaws()`更改为C函数,而不是C++. (2认同)
  • 感谢您提供精彩的答案和精彩的例子=) (2认同)