外部内联风险

时间:2015-03-08 14:37:00

标签: c inline c11

我不明白为什么这是不可能的:

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

1 个答案:

答案 0 :(得分:-1)

inline关键字允许您在所有翻译单元,TU,(.c文件)中显示该功能的定义,而不会导致"多个已定义的符号&#34 ;错误。如果你想到这个目的,只在一个inline文件中定义.c并通过标题声明在所有其他文件中引用它就没有多大意义。在这种情况下,只需忽略inline它没有用处。 (并且标题中的extern inline声明更不合理。)

对于预见的情况,头文件中的inline定义避免在任何转换单元中生成符号。所以这些不同的翻译单元不能相互冲突。当您的代码实际需要符号时,此策略是一个明显的限制。例如,如果您获取函数的地址,或者编译器因任何原因决定他不能或不会使用函数的定义"在行&#34中就是这种情况。 ;。因此,您始终应该告诉编译器您要在哪个TU中发出符号。