我不明白为什么这是不可能的:
inline void f(void) {}
int main(void)
{
f();
}
来自extern inline的回答:
C99(或GNU99):
“inline”:就像GNU“extern inline”;没有外部可见的函数
发射,但可能被召唤,因此必须存在
问题1:
我的理解是f()在外部是不可见的,对我来说,外部可见意味着我不能从另一个文件调用f(),但这里我直接在main中调用它,有什么问题?
解决方案
将定义放入.h文件。
inline void f(void) {}
只有一个.c文件中的声明
extern inline void f(void);
问题2:
但我也可以:
此声明位于头文件中
extern inline void f(void);
这个定义只存在于一个.c文件中
extern void f(void) {}
现在我可以随心所欲地使用函数了,唯一的条件是不写
extern void f(void) {}
在任何其他.c文件中。
如果我不使用“正常”的解决方案,并且像我刚刚写的那样,会有什么风险?
编译时使用
gcc-标准=c11
最佳答案
inline
关键字允许您使函数的定义在所有翻译单元TU(.c
文件)中可见,而不会导致“多个定义的符号”错误。如果考虑到这一点,在一个inline
文件中定义.c
并通过头声明在所有其他文件中引用它就没有多大意义。在这种情况下,只需忽略inline
它没有任何作用。(而头中的extern inline
声明就更没有意义了。)
对于可以预见的情况,头文件中的inline
定义避免在任何转换单元中生成符号。所以这些不同的翻译单位不能相互冲突。当代码实际需要符号时,这种策略显然是一个限制。例如,如果您获取函数的地址,或者编译器出于任何原因决定他不能或不愿使用函数“in line”的定义,就会出现这种情况因此,您应该始终告诉编译器您希望在哪个TU中发出符号。
关于c - 外部内联风险,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28927637/