头文件中定义的小函数:内联还是静态?

我有一些在.h文件中定义的小函数。 这是一个小项目(现在),我想避免将声明和定义分开的痛苦,因为它们一直在变化。 为了避免乘法定义的符号,我可以将它们staticinline 。 什么应该是首选,为什么?

我知道在头文件中定义函数通常是不好的做法。 您不必在答案中提及,这个问题在技术上意味着。

我使用static inline ,但static也可以。

externextern inline是因为如果标题包含在多个转换单元中,您将获得多个外部定义,因此您需要考虑staticstatic inlineinline规范。

Heptic在他的回答中正确地指出,无论inline联是否被指定,大多数编译器都会考虑内联函数,即inline的主要影响是它对链接的影响。

但是, static定义具有内部链接,因此staticstatic inline之间没有太大区别; 出于纯粹的风格原因,我更喜欢static inline函数定义头文件(经验法则:头文件应该只包含extern声明, static const变量定义和static inline函数定义)。

没有staticextern内联导致内联定义 ,标准规定(C99 6.7.4,§6)

提供外部定义的替代方案,翻译者可以使用该定义在同一翻译单元中实现对该function的任何调用。 未指定对函数的调用是使用内联定义还是使用外部定义。

即内联定义应始终伴随外部定义,而不是您正在寻找的定义。

关于C99内联语义的细微之处的更多信息可以在这个答案中找到,在Clang主页和C99基本原理(PDF)中 。

请记住,如果-std=c99-std=gnu99存在,GCC将仅使用C99语义…

由于问题是关于C(不是C ++), inline意味着

  1. 您希望“尽可能快地调用该函数” (ISO9899-1999,6.7.4(5))。 同一段还指出,这一建议在多大程度上是有效的。 换句话说,它几乎没有影响,并且根本不暗示任何内联(事实上,由于指令缓存效应,非内联可能更快)。
  2. 有一些限制和特殊情况与extern结合使用(ISO9899-1999,6.7.4(6),例如,必须在同一编译单元中定义具有外部链接的inline函数,并且内联定义允许在其他地方进行extern定义而不用一个错误(这不一定是好事,因为这两个函数不需要在function上等效,并且未指定编译器在任何时候使用哪个函数!)。

C ++需要Heptic提供的链接器含义,但C不需要(据我所知)。 它们必须由ISO14882,7.1.2(4)中的“在所有翻译单元中具有相同的地址”条款所要求。 我不知道C99中有任何类似的条款。
但是,由于完全不同的语言C和C ++通常使用相同的C / C ++编译器和链接器,因此无论如何它对C来说可能都是相同的。

那么……如何回答你的问题? 当你觉得它足够时使用inline 。 请注意extern可能存在的陷阱。 否则,请将其丢弃,并相信编译器可以正确执行。

我认为静态内联是你想要内联的函数的方法,而对于那些你不想要的函数只有静态

static指的是可见性,但内联对标准中的可见性(C99)不明确。 无论如何,它不是它的目的: 内联是用于内联函数,因此它从您可能不想要的可见性角度来看具有副作用。