外部内联函数会发生什么?

mus*_*tze 13 c compiler-construction linker inline header

如果我在.h文件中定义我的函数会发生什么

extern int returnaint(void);
Run Code Online (Sandbox Code Playgroud)

,在相关的.c文件中定义它

inline int returnaint(void) {
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

并将标题包含在另一个.c文件中并使用该函数?当我单独编译事物时,为每个.c文件创建一个目标文件然后链接它们,包括内联函数,或者会发生什么?

我知道编译器可以忽略inline,但如果它在这种情况下不忽略它怎么办?

Jen*_*edt 25

在文件中添加inline函数定义.c只是多余的.

  • 您的.c文件编译单元看到一个extern声明(没有inline)和一个inline定义.因此,它为目标文件中的函数发出符号.

  • 所有其他编译单元只能看到extern声明,因此如果您将最终可执行文件与其他.o文件链接,它们可以毫无问题地使用该函数.

事实上,你只是错误的方式.此功能旨在用于您inline.h文件中具有定义,对每个人都可见.函数的这个定义只作为符号的声明,就像它一样extern,但没有定义它.

extern只有一个.c文件(编译单元)中的声明确保在那里定义符号.

术语有点令人困惑,inline 定义充当符号的extern 声明,而声明充当它的定义

  • 我使用的编译器,主要是gcc,但也包括clang或icc,与`inline`没有区别,他们甚至不把它作为提示.为了让他们相信你比他们更了解,你必须使用一些编译标志或使用`__attribute __((allways_inline))`来改变它们.所以不,不要指望只添加`inline`会改变任何东西. (3认同)
  • 好点。我想我应该将内联函数移到标题中!:-) (2认同)

Yu *_*Hao 5

它不会编译.来自C11(ISO/IEC 9899:2011)§6.7.4 函数说明符(重点已添加):

具有内部链接的任何函数都可以是内联函数.对于具有外部链接的函数,以下限制适用:如果使用内联函数说明符声明函数,则它也应在同一转换单元中定义.如果转换单元中函数的所有文件范围声明都包含不带extern的内联函数说明符,则该转换单元中的定义是内联定义.内联定义不提供函数的外部定义,也不禁止另一个转换单元中的外部定义.内联定义提供了外部定义的替代,翻译器可以使用该定义在同一翻译单元中实现对该功能的任何调用.未指定对函数的调用是使用内联定义还是使用外部定义.140)

140)由于内联定义不同于相应的外部定义以及其他翻译单元中的任何其他相应内联定义,因此具有静态存储持续时间的所有相应对象在每个定义中也是不同的.

另一个.c文件只inline从头部获取函数的声明,但不获取定义,因此它以粗体字符表示规则.

编辑:

正如@Jens Gustedt指出的那样,我之前的解释是错误的,因为在OP的问题中,函数在头文件中被声明为非内联:

extern int returnaint(void);
Run Code Online (Sandbox Code Playgroud)

所以另一个.c文件会像普通函数一样对待它.

  • 错误的答案.其他`.c`文件看不到'inline`,`.h`中的声明只有`extern`而不是'inline`. (9认同)