gpt4 book ai didi

c - C99 中的内联、静态、外部

转载 作者:行者123 更新时间:2023-12-05 01:37:58 24 4
gpt4 key购买 nike

请不要将我重定向到这里的答案 - 我已经阅读了它们,以及互联网上的其他答案,包括标准,但仍然感到困惑(大多数情况下,我认为是因为技术词、英语词和语言的重叠关键字)。

让我说清楚,在 C99 中,用于函数 :
static : 不产生任何外部符号
extern (隐式):如果此翻译单元中没有定义,则编译器会生成一个在链接期间解析的引用

现在与 inline .据我所知,由于编译器可能会选择内联或不内联,因此问题很复杂。

  • 如果编译器决定内联,显然实现必须在编译时可见
  • 如果编译器决定不内联,哪个函数会被链接,该代码存在于哪个翻译单元中?


  • 我可以看到以两种不同的方式回答这个问题:
  • 如果编译器决定不在某个调用点内联函数,则在同一翻译单元内生成非内联目标代码。没有为此导出外部符号。
  • 如果编译器决定不在某个调用点内联函数,那么这将表现为正常函数,并且必须有一个翻译单元导出外部符号并包含实现该函数的目标代码。

  • static inline似乎是#1的答案:
  • 如果编译器决定内联 static inline功能,然后去吧。 static存储说明符与非内联函数的使用一致,因为不产生外部符号。既然如此,如果编译器决定内联 static inline在翻译单元内的每个调用点运行,它不需要生成独立的目标代码。
  • 如果编译器决定不内联 static inline函数在某个调用点,然后它可以在翻译单元内部生成独立的目标代码,并且不会为其导出外部符号。


  • 据我所知, extern inline/ inline是#2的答案:
  • 全部 inline (没有 externstatic )表现得像#2。如果编译器实际上没有内联它们,那么在链接时需要链接一个外部实现。
  • 实际导出要链接的符号的翻译单元
    必须声明为 extern inline . 我认为这是最
    令人困惑,因为 extern正常函数的关键字表现在
    几乎完全相反的方式


  • 这样对吗?

    相关链接,但仍然留下模糊的角落:

    Is “inline” without “static” or “extern” ever useful in C99?

    extern inline

    The New C: Inline Functions

    最佳答案

    您对此的总体理解是正确的。

    The translation unit that actually exports a symbol to link against must declare as extern inline. I think this is what's most confusing, since the extern keyword for normal functions behaves in almost the exact opposite way



    是的,这是语言的一个不幸的部分,但你有它的权利。

    作为一个小琐事(希望不会让你感到困惑),GNU gcc 二手 以与 C99/C11 标准处理它们的方式完全相反的方式处理“内联”和“外部内联”。在这种情况下,GNU 会将“内联”解释为“使用此定义与 内联产生此函数的外联、外部可见定义”,并将“外联内联”视为“仅将此定义用于内联;如果未发生内联,则发出对该函数的外部引用(必须在其他地方定义)”。

    无论出于何种原因,C99 标准选择交换“inline”和“extern inline”的含义,现在我们坚持使用它。

    注意:快速测试表明,如果您不通过 -std=c99/c11 或 -fno-gnu89-inline,GNU gcc v4.9.2 将默认为“GNU”方式(-fgnu89-inline)。从那时到 GNU gcc v5.2.1 之间的某个时间,它发生了变化,因为 v5.2.1 将默认为 -fno-gnu89-inline(即标准 C99/C11 方式)。

    关于c - C99 中的内联、静态、外部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34937816/

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