我不明白为什么这是不可能的:
inline void f(void) {}
int main(void)
{
f();
}
来自extern inline的答案:
C99(或GNU99):
"内联":像GNU" extern inline&#34 ;;没有外部可见的功能 发射,但可能会被调用,因此必须存在
问题1:
我的理解是f()不是外部可见的,对我来说外部可见意味着我不能从另一个文件中调用f(),但是我在这里直接在main中调用它。& fhat&问题是什么?
将定义放在.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 -std = c11
答案 0 :(得分:-1)
inline
关键字允许您在所有翻译单元,TU,(.c
文件)中显示该功能的定义,而不会导致"多个已定义的符号&#34 ;错误。如果你想到这个目的,只在一个inline
文件中定义.c
并通过标题声明在所有其他文件中引用它就没有多大意义。在这种情况下,只需忽略inline
它没有用处。 (并且标题中的extern inline
声明更不合理。)
对于预见的情况,头文件中的inline
定义避免在任何转换单元中生成符号。所以这些不同的翻译单元不能相互冲突。当您的代码实际需要符号时,此策略是一个明显的限制。例如,如果您获取函数的地址,或者编译器因任何原因决定他不能或不会使用函数的定义"在行&#34中就是这种情况。 ;。因此,您始终应该告诉编译器您要在哪个TU中发出符号。