是否可以通过在另一个文件中声明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为gcc
,clang
或tcc
)有效。这是符合要求的C示例吗?
答案 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
仍然是具有外部链接并具有外部定义的函数。
任何内联定义仅与内联定义在同一翻译单元中相关。