extern内联做什么?

问题描述 投票:86回答:6

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

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

extern inline在图片中适合什么位置?

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

C ++和C之间有区别吗?

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

c++ c extern inline-functions
6个回答
125
投票

在K&R C或C89中,内联不是该语言的一部分。许多编译器将其实现为扩展,但没有定义有关其工作方式的语义。 GCC是第一个实现内联的人,并引入了inlinestatic inlineextern inline构造。大多数C99之前的编译器通常都遵循其领先地位。

GNU89:

  • inline:该函数可能是内联的(虽然只是一个提示)。脱机版本始终会发出并在外部可见。因此,您只能在一个编译单元中定义这种内联,而其他每个内联都需要将其视为外联函数(否则您将在链接时看到重复的符号)。
  • extern inline不会生成离线版本,但可能会调用一个版本(因此您必须在其他编译单元中对其进行定义。但是,一个定义规则适用;但是,离线版本必须具有如果编译器调用了此代码,则与此处提供的内联代码相同。
  • static inline将不会生成外部可见的离线版本,尽管它可能会生成静态的文件。一定义规则不适用,因为永远不会发出外部符号,也不会调用它。

C99(或GNU99):

  • inline:类似于GNU89“外部内联”;不会发出任何外部可见函数,但是可能会调用一个函数,因此必须存在]
  • [extern inline:就像GNU89“ inline”:发出外部可见代码,因此最多一个翻译单元可以使用此代码。
  • static inline:类似于GNU89“静态内联”。这是gnu89和c99之间的唯一便携式产品。
  • C ++:

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


29
投票

我相信您根据此陈述误解了__FILE__和__LINE __:


13
投票

听起来您正在尝试编写类似这样的内容:


3
投票

内联,静态内联和外部内联的情况很复杂,这不仅是因为gcc和C99为它们的行为(也可能是C ++)定义了稍有不同的含义。您可以在C here中找到一些有用的详细信息。


2
投票

宏是您的选择,而不是内联函数。宏统治内联函数的罕见情况。请尝试以下操作:我编写了此“ MACRO MAGIC”代码,它应该可以工作!在gcc / g ++ Ubuntu 10.04上测试]


1
投票

而不是回答“它做什么?”,而是回答“如何使它按照我的意愿去做?”内联共有5种,可以在GNU C89,标准C99和C ++中使用:

始终内联,除非使用地址

© www.soinside.com 2019 - 2024. All rights reserved.