【问题标题】:What's the difference between static inline, extern inline and a normal inline function?静态内联、外部内联和普通内联函数有什么区别?
【发布时间】:2014-09-19 22:49:03
【问题描述】:

static inlineextern inline 和普通的inline 函数有什么区别?

我看到了一些关于此的模糊解释。据我了解,static inline 不仅仅是一个inline 函数,它只能在某个文件中被引用,因为static 关键字通常意味着。我猜extern inline 也是如此,这与extern 变量的解释不同。任何答案将不胜感激!

【问题讨论】:

标签: c static extern inline-functions


【解决方案1】:

带有static inline 的函数定义定义了具有内部链接的内联函数。此类函数根据这些限定符的“通常”属性“按预期”工作:static 为其提供内部链接,inline 使其内联。所以,这个函数对于翻译单元是“本地的”并内联在其中。

只有inline 的函数定义定义了一个带有外部链接的内联函数。但是,这种定义称为内联定义,它不能作为该函数的外部定义。这意味着即使此函数具有外部链接,它也会被其他翻译单元视为未定义,除非您在某处为其提供单独的外部定义

带有extern inline 的函数定义定义了一个具有外部链接的内联函数,同时该定义用作该函数的外部定义。可以从其他翻译单元调用此类函数。

最后两段意味着您可以选择为具有外部链接的内联函数提供单个 extern inline 定义,或者为其提供两个单独的定义:一个 inline 和另一个 extern。在后一种情况下,当您调用该函数时,允许编译器选择两个定义中的任何一个。

【讨论】:

  • 澄清你的最后一段:提供两个单独的定义没有必要(事实上,不建议)提供两个函数体。取而代之的是 extern inline void f();,它看起来像(并且是)一个声明,具有将早期的 inline void f() { ..... } 转换为该单元的外部定义而不是内联定义的效果。 (参考 C11 6.7.4/7)。
  • 阅读此答案后,我无法理解“外部定义”与“内部定义”的确切含义。我在哪里可以找到更多信息?
  • “或提供两个单独的定义”inline int il_fun0(void) { return 0; } extern int il_fun0(void) { return 0; } 导致 C11 编译错误“错误:重新定义 'il_fun0'”(有或没有 extern)。 `
  • @learnlearnlearn 内联定义用于函数内联。外部定义照常用于函数调用。 inline 关键字只是对编译器的提示,因此您无法确定您的函数调用是编译为内联调用还是正常调用。因此,我们应该为同一个内联函数准备两个定义。每个调用内联函数的翻译单元必须有自己的内联定义才能处理内联。此外,只有一个翻译单元必须具有外部定义才能处理正常调用。
  • @learnlearnlearn 例如,当您关闭编译器的优化选项时,内联函数调用将被编译为正常的函数调用。在这种情况下,所有正常调用都引用唯一一个相同的外部定义。而当您打开优化选项时,内联函数调用将被编译为内联。在这种情况下,内联是通过每个翻译单元自己的内联定义来实现的。所以我们把inline void func(void) {}放在头文件中进行内联,把extern inline void func(void);放在源文件(单独的翻译单元)中进行正常调用。
猜你喜欢
  • 2012-10-01
  • 2013-10-21
  • 2019-07-08
  • 1970-01-01
  • 2017-12-24
  • 2020-07-19
  • 1970-01-01
  • 2010-09-18
  • 2012-05-09
相关资源
最近更新 更多