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

时间:2018-10-29 09:04:18

标签: c language-lawyer

是否可以通过在另一个文件中声明extern来与实例化的非静态内联函数链接?

inline.c:

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

main.c:

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

凭经验$CC main.c inline.c(其中CC为gccclangtcc)有效。这是符合要求的C示例吗?

1 个答案:

答案 0 :(得分:3)

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

C17 6.7.4 / 7中的文字是:

  

如果函数中的所有文件范围声明   一个翻译单元包括inline函数说明符而不包含extern,则该翻译单元中的定义是内联定义

“ {if1 ...}”子句不适用于inline.c,因为第二行用extern声明了标识符。因此,第一行实际上是外部定义,而不是内联定义。

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


如果inline.c仅包含第一行(这是内联定义),并且extern inline int foo(void);出现在第三翻译单元中,也可以。 foo仍然是具有外部链接并具有外部定义的函数。

任何内联定义仅与内联定义在同一翻译单元中相关。