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

时间:2012-02-24 09:35:55

标签: c static inline header-files

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

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

3 个答案:

答案 0 :(得分:25)

我会使用static inline,但static也能正常使用。

externextern inline已经出局,因为如果标题包含在多个翻译单元中,您将获得多个外部定义,因此您需要考虑static,{{1 }和static inline规范。

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

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

没有static inlineinline

static会产生内联定义,标准声明(C99 6.7.4,§6)

  

提供了外部定义的替代方案,翻译人员可以使用该定义来实现   在同一翻译单元中对该功能的任何调用。没有具体说明是否打电话给   函数使用内联定义或外部定义。

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

有关C99内联语义细微之处的更多信息,请参见this answerClang homepageC99 Rationale (PDF)

请注意,如果extern-std=c99存在,GCC将仅使用C99语义...

答案 1 :(得分:3)

由于问题是关于C(不是C ++),inline表示

  1. 您希望“尽可能快地调用该函数”(ISO9899-1999,6.7.4(5))。同一段还指出,这一建议在多大程度上是有效的。换句话说,它几乎没有影响,并且根本不暗示任何内联(事实上,由于指令缓存效应,非内联可能更快)。
  2. 有一些限制和特殊情况与extern结合使用(ISO9899-1999,6.7.4(6),例如,必须在同一编译单元中定义具有外部链接的inline函数,内联定义允许extern定义在别处没有错误(这不一定是好事,因为这两个函数不需要在功能上等同,并且未指定哪一个是编译器随时使用!)。
  3. C ++需要Heptic提供的链接器含义,但C不需要(据我所知)。它们必然是“在ISO14882,7.1.2(4)中的所有翻译单元中具有相同的地址”子句。我不知道C99中有任何类似的条款 但是,由于完全不同的语言C和C ++通常使用相同的C / C ++编译器和链接器,因此无论如何它可能与C语言相同。

    那么...如何回答你的问题?当您认为足够时,请使用inline。请注意extern可能存在的陷阱。否则,请将其保留,并相信编译器可以正确执行。

答案 2 :(得分:0)

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

静态是指可见性,但内联对标准(C99)中的可见性不明确。无论如何,它不是它的目的: inline 用于内联函数,因此它从您可能不需要的可见性角度出现副作用。