gpt4 book ai didi

c - C中不同宏函数/内联方法的优缺点

转载 作者:太空狗 更新时间:2023-10-29 16:51:46 25 4
gpt4 key购买 nike

According to the C FAQ ,在 C 中“内联”代码基本上有 3 种实用方法:

#define MACRO(arg1, arg2) do { \
/* declarations */ \
stmt1; \
stmt2; \
/* ... */ \
} while(0) /* (no trailing ; ) */

#define FUNC(arg1, arg2) (expr1, expr2, expr3)

为了阐明这一点,表达式中使用了参数,逗号运算符返回最后一个表达式的值。

使用 inline 声明,支持 extension to gcc and in the c99 standard .

do { ... } while (0) 方法在 Linux 内核中被广泛使用,但我没有经常遇到其他两种方法。

我指的是多语句“函数”,而不是像 MAX 或 MIN 这样的单语句函数。

每种方法的优缺点是什么?为什么在不同情况下您会选择其中一种?

最佳答案

谈到宏的具体用途,即充当“函数”的宏,我会提到在内联函数中不能拥有的宏的以下优点:

惰性参数求值。例如,像这样的宏

#define SELECT(f, a, b) ((f) ? (a) : (b))

将保留三元运算符的惰性参数求值属性:仅对选定的参数求值,而另一个不求值。一个直接的内联函数类似物会提前评估两个参数,从而完成额外的不必要的工作。

访问上下文。宏可用于实现“局部函数”的某些相似之处,即可以访问封闭函数的局部变量和参数的重复代码片段。

类型独立性(和类型参数)。宏允许您编写与类型无关的“函数”(见上例)。如果您无法摆脱类型依赖,您可以将类型作为参数传递给宏。

宏的上述属性,我作为它们的优点提出,可能被滥用导致重大失败(因此也可能作为缺点提出)。但 C 中的许多语言特性都可以这么说。

关于c - C中不同宏函数/内联方法的优缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1571392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com