gpt4 book ai didi

c++ - 外部内联做什么?

转载 作者:IT老高 更新时间:2023-10-28 11:59:46 26 4
gpt4 key购买 nike

我理解 inline 本身就是对编译器的建议,它可以自行决定是否内联函数,它也会生成可链接的目标代码。

我认为 static inline 的作用相同(可能内联也可能不内联),但在内联时不会产生可链接的目标代码(因为没有其他模块可以链接到它)。

extern inline在哪里适合?

假设我想用内联函数替换预处理器宏并要求内联该函数(例如,因为它使用应该解析的 __FILE____LINE__ 宏对于调用者,但不是这个被调用的函数)。也就是说,如果函数没有内联,我想查看编译器或链接器错误。 extern inline 会这样做吗? (我认为,如果没有,除了坚持使用宏之外,没有其他方法可以实现此行为。)

C++ 和 C 有区别吗?

不同的编译器供应商和版本之间有区别吗?

最佳答案

在 K&R C 或 C89 中,内联不是语言的一部分。许多编译器将其作为扩展实现,但没有定义关于它如何工作的语义。 GCC 是最早实现内联的,并引入了 inlinestatic inlineextern inline 结构;大多数 C99 之前的编译器通常会效仿。

GNU89:

  • inline:函数可能是内联的(虽然这只是一个提示)。离线版本始终会发出并在外部可见。因此,您只能在一个编译单元中定义这样的内联,而其他每个编译单元都需要将其视为一个外联函数(否则您将在链接时得到重复的符号)。
  • extern inline 不会生成一个外联版本,但可能会调用一个(因此您必须在其他编译单元中定义它。不过,单定义规则适用;out -of-line 版本必须与此处提供的内联代码具有相同的代码,以防编译器调用它。
  • static inline 不会生成外部可见的离线版本,尽管它可能会生成文件静态版本。单一定义规则不适用,因为从来没有发出外部符号,也没有调用一个。

C99(或 GNU99):

  • inline:类似于 GNU89 “extern inline”;没有发出外部可见的函数,但可能会调用一个函数,因此必须存在
  • extern inline:类似于 GNU89 “inline”:发出外部可见的代码,所以最多一个翻译单元可以使用它。
  • 静态内联:类似于 GNU89 “静态内联”。这是 gnu89 和 c99 之间唯一的可移植

C++:

在任何地方都内联的函数必须在任何地方都内联,并且具有相同的定义。编译器/链接器将整理符号的多个实例。 static inlineextern inline 没有定义,尽管许多编译器都有它们(通常遵循 gnu89 模型)。

关于c++ - 外部内联做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/216510/

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