我有一些在.h
文件中定义的小函数。这是一个小项目(现在),我想避免将声明和定义分开的痛苦,因为它们一直在变化。为了避免多重定义的符号,我可以让它们static
或inline
。什么应该是首选,为什么?
我知道在头文件中定义函数通常是不好的做法。你不必在答案中提到这个问题在技术上意味着。
答案 0 :(得分:25)
我会使用static inline
,但static
也能正常使用。
extern
和extern inline
已经出局,因为如果标题包含在多个翻译单元中,您将获得多个外部定义,因此您需要考虑static
,{{1 }和static inline
规范。
Heptic在他的回答中正确地指出,无论是否指定inline
,大多数编译器都会考虑内联函数,即inline
的主要影响是它对链接的影响。
但是,inline
定义具有内部链接,因此static
和static
之间没有太大区别;出于纯粹的文体原因,我更喜欢static inline
头文件中的函数定义(经验法则:头文件应该只包含static inline
声明,extern
变量定义和static const
函数定义)
static inline
或inline
的 static
会产生内联定义,标准声明(C99 6.7.4,§6)
提供了外部定义的替代方案,翻译人员可以使用该定义来实现 在同一翻译单元中对该功能的任何调用。没有具体说明是否打电话给 函数使用内联定义或外部定义。
即内联定义应始终伴随外部定义,而不是您正在寻找的内容。
有关C99内联语义细微之处的更多信息,请参见this answer,Clang homepage和C99 Rationale (PDF)。
请注意,如果extern
或-std=c99
存在,GCC将仅使用C99语义...
答案 1 :(得分:3)
由于问题是关于C(不是C ++),inline
表示
extern
结合使用(ISO9899-1999,6.7.4(6),例如,必须在同一编译单元中定义具有外部链接的inline
函数,内联定义允许extern
定义在别处没有错误(这不一定是好事,因为这两个函数不需要在功能上等同,并且未指定哪一个是编译器随时使用!)。C ++需要Heptic提供的链接器含义,但C不需要(据我所知)。它们必然是“在ISO14882,7.1.2(4)中的所有翻译单元中具有相同的地址”子句。我不知道C99中有任何类似的条款 但是,由于完全不同的语言C和C ++通常使用相同的C / C ++编译器和链接器,因此无论如何它可能与C语言相同。
那么...如何回答你的问题?当您认为足够时,请使用inline
。请注意extern
可能存在的陷阱。否则,请将其保留,并相信编译器可以正确执行。
答案 2 :(得分:0)
我认为静态内联是您想要内联的函数的方法,而对于那些您不想要的函数,只有 static 。
静态是指可见性,但内联对标准(C99)中的可见性不明确。无论如何,它不是它的目的: inline 用于内联函数,因此它从您可能不需要的可见性角度出现副作用。