我不是在回答“它做什么?”,而是在回答“我如何使它做我想要的?”。内联共有5种,可以在GNU C89,标准C99和C ++中使用:
始终内联,除非使用地址
加 __attribute__((always_inline))
到任何声明中,然后使用以下情况之一处理其地址被占用的可能性。
除非您需要它的语义(例如以某种方式影响程序集或使用 alloca
)。编译器通常比您更了解它是否值得。
内联并发出弱符号(如C ++,又名“使其正常工作”)
__attribute__((weak))
void foo(void);
inline void foo(void) { ... }
请注意,这会留下一堆相同代码的副本,链接器会任意选择一个。
内联,但从不发出任何符号(保留外部引用)
__attribute__((gnu_inline))
extern inline void foo(void) { ... }
始终发出(对于一个TU,可以解决前面的问题)
提示版本在C ++中发出一个弱符号,但在C的任一方言中都发出强符号:
void foo(void);
inline void foo(void) { ... }
或者,您也可以不使用提示,而提示会在两种语言中发出强烈的符号:
void foo(void) { ... }
通常,您在提供定义时就知道TU是什么语言,并且可能不需要太多内联。
内联并在每个TU中发出
static inline void foo(void) { ... }
对于除static
一个以外的所有这些,您可以在void foo(void)
上面添加一个声明。这有助于编写最佳标头的“最佳实践”,然后#include
使用内联定义创建一个单独的文件。然后,如果使用C风格的内联,#define
一个专用TU中的某些宏会有所不同,以提供脱机定义。
不要忘记,extern "C"
是否可以在C和C ++中同时使用标头!