来自C18标准:
如果翻译单元中一个函数的所有文件作用域声明都包含内联函数说明符而没有 extern,则该翻译单元中的定义是“内联定义”。
然后我们看到:
具有外部链接的内联函数的声明可能导致外部定义,也可能导致仅在翻译单元内可用的定义。带有 extern 的文件作用域声明会创建一个外部定义。
我编写了一些代码来检查函数是否实际上是内联的。 我使用了这个限制来找出:
具有外部链接的内联函数的内联定义不得包含具有静态或线程存储期的可修改对象的定义,并且不得包含对具有内部链接的标识符的引用。
这是代码:
static int n = 5;
void inline foo() { n = 66; }
void inline foo(); // remove 'inline' in second version
int main() {
return 0;
}
编译时出现警告,提示内联函数正在使用静态对象,这意味着 foo() 是一个内联函数,因此它提供了内联(而非外部)定义。但是,当我从指定行中删除 inline 说明符时,就不再收到警告了。根据标准,它不是内联定义,所以我猜它提供了外部定义。
标准没有说,或者至少我看不到的是,一个提供外部定义的内联函数是否停止成为内联函数。根据我的测试,它确实停止成为内联函数。
如果我的结论是正确的,那么另一个问题就出现了:为什么 extern inline 函数是无用的?