c - inline和#define在实践中有什么区别?

标签 c inline c-preprocessor

正如标题所说; inline 关键字和#define 预处理器指令在实践中有什么区别?

最佳答案

#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 递增不止一次。


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

主要原因是宏概念针对实现的透明性(文本代码替换),而内联针对适当的语言概念,使调用语义对用户更加透明。

关于c - inline和#define在实践中有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3554527/

相关文章:

c - 递增变量将我的指针更改为指针数组值

c - 如何在c中使用指针与字符进行比较?

inline - 如何通过在 python-sphinx 中使用角色来使用唯一的内联指令?

c - 在不使用 # 字符的情况下使用预处理器指令

c++ - C中的 "inactive"预处理器 block 是什么意思?

c - 在 C 中传递可变数量参数的更紧凑方法

c - 将指针传递给函数但指针保持不变

c++ - 如何动态构建和链接 boost::regex 与隐藏的内联?

inline - 为了在内联方法中使用它们而混淆对优先私有(private)但实际上是公共(public)类成员的访问的方法

c - 查看扩展的 C 宏