【发布时间】:2018-01-10 16:42:11
【问题描述】:
我正在尝试了解外部内联和内联函数。
What's the difference between static inline, extern inline and a normal inline function?
引用上述链接中的行: “只有内联的函数定义定义了具有外部链接的内联函数。但是,这种定义称为内联定义,它不能作为该函数的外部定义。这意味着即使该函数具有外部链接,它也会被其他翻译单元视为未定义,除非您在某处为其提供单独的外部定义。
具有extern inline 的函数定义定义了具有外部链接的内联函数,同时该定义用作该函数的外部定义。可以从其他翻译单元调用此类函数。”
但我无法正确理解这一点。
我有一个示例代码来解释我的理解:
- 内联函数:
在 temp1.c 中
#include <stdint.h>
extern int32_t fun1(void);
int32_t main(void)
{
int32_t result = fun1();
return result;
}
在 temp2.c 中
#include <stdint.h>
int32_t fun1(void);
inline int32_t fun1(void)
{
return 0;
}
由于 fun1 是 temp2.c 中的内联定义,因此它将被视为从 temp1.c 未定义。因此 temp1.c 中的外部声明使 temp1.c 可以从 temp2.c 访问 fun1。我很困惑,因为引号中说的是“单独的外部定义”而不是外部声明。
- 外部内联函数
temp1.c
#include <stdint.h>
int32_t fun1(void);
int32_t main(void)
{
int32_t result = fun1();
return result;
}
temp2.c
#include <stdint.h>
extern inline int32_t fun1(void)
{
return 0;
}
由于 fun1 是外部内联函数,所以可以从 temp1.c 中调用。 我观察到的唯一区别是,不需要显式声明定义它的外部内联函数。
这是唯一的区别吗?否则内联和外联内联函数的其他主要区别和范围是什么?
以上观点如有错误请指正
【问题讨论】:
-
该链接作为未编译的情况,因为我们没有在同一个翻译单元中声明该函数。但就我而言,我已经声明并且它正在正确编译
-
我正在使用这些问题(以及您引用的问题)作为指导。 extern inline — Is "inline" without "static" or "extern" ever useful in C99? — 。 How to declare an inline function in a C99 multi-file project?。我写这篇文章的实验可以在我的 SOQ 存储库的 GitHub 上找到:github.com/jleffler/soq/blob/osiris/extern-inline/src/…
-
您的两个示例都是 UB,因为您在一个单元中有一个声明为
inline的函数,但在另一个单元中没有声明inline