代码之家  ›  专栏  ›  技术社区  ›  Petr Skocik

使用extern引用非静态内联函数的实例化

  •  2
  • Petr Skocik  · 技术社区  · 7 年前

    extern

    内联.c:

    inline int foo(void) { return 42; }
    extern inline int foo(void);
    

    主c:

    extern int foo(void);
    int main(){ return foo(); }
    

    经验上 $CC main.c inline.c (其中CC是 gcc , clang tcc )工作。这是一个C的例子吗?

    1 回复  |  直到 7 年前
        1
  •  3
  •   M.M    7 年前

    这里的第一个问题是关于 extern inline int foo(void); 在与表观内联定义相同的翻译单元中。

    C17 6.7.4/7中的文本为:

    如果函数的所有文件作用域声明 翻译单元包括 inline 函数说明符 extern ,则该翻译单元中的定义为 内联定义 .

    inline.c 外部 . 所以第一行实际上是 ,不是内联定义。

    然后,使用 extern int foo(void); 在另一个翻译单位是好的。 foo 是具有外部链接的函数,具有外部定义。没有任何规则可以排除这一点。


    如果 内联.c 内联定义 ,和 外部内联int foo(void); 出现在第三个翻译单元。 仍然是具有外部链接和外部定义的函数。