我是否应该故意在C99中跨翻译单元内联函数
在我的问题中,我最初问了这四个问题我是否应该故意在C99中跨翻译单元内联函数,c,c99,inline-functions,C,C99,Inline Functions,在我的问题中,我最初问了这四个问题 在C99编译器中,当涉及到跨翻译单元的内联时,inline实现的行为是否已定义 如果是,是否应该避免 有没有其他被普遍接受的方法 如果我的inline函数没有处处内联,我至少会得到某种链接器错误吗 在我的OP之后,我发现第一个问题已经在以下线程中进行了详细讨论: 关于这个话题有更多的线索,但这两条似乎一针见血 因此,基于这两个讨论,我们可以看到问题1的答案是肯定的。编译器在处理inline说明符方面绝对有一定的自由度 我们还看到,要使其工作,必须在头中
inline
实现的行为是否已定义inline
函数没有处处内联,我至少会得到某种链接器错误吗inline
说明符方面绝对有一定的自由度
我们还看到,要使其工作,必须在头中定义内联
函数
除此之外,还存在以下选项:
静态
说明符静态
说明符,则可以通过某个公共头文件中的外部
声明所有调用函数的C文件也将#包括
extern
声明这个inline
函数inline
不会导致代码膨胀——事实上,结果可以忽略不计。Gregory Pakosz概述了何时使用内联
函数以及何时不使用内联函数。因此,如果这是在一个翻译单元中使用的一个函数,答案将非常清楚。但这不是我要问的
在这种情况下,我不需要内联这个函数。但我应该吗?我可能永远不会注意到任何性能差异,因为我只内联了这一个函数。但我想弄清楚,在所有类似的情况下,我是否应该把这作为我的常规做法。如果我内联经常被更积极地调用的短函数,我可能会看到性能的提高。(我的运行时环境是一个低功耗16位RISC MCU——这可能是一个重要的细节。)
提出这个问题的原因是,程序员之间似乎对此存在分歧。出于某种原因,跨翻译单元内联函数(无论您如何操作)是不是很不礼貌?如果是,为什么
假设我跨翻译单元执行内联函数,那么最不讨厌或最可接受的方式是什么?
将static
放在标题中似乎效果不错,可能是最方便的方法。评论和答复中指出了这一点。表面上看,我似乎在使用static
来促进全局使用某些东西,这简直是胡说八道!但是我想我可以更正确地这样思考:内联这个函数的每个函数都有自己的静态副本,就好像它在各自的C文件中被定义为static inline
。如果这种理解是正确的,那么行为似乎总是可以预测的——如果翻译单元中有两个同名函数,链接器必须通知我
我不确定我对通过头中的
extern
声明函数的感觉如何。6.7.4中的措辞是,另一个翻译单元中的外部定义是“不禁止的”。我认为您的驱动程序.h应该是这样的:
static inline void foo(void)
{
<one line>;
}
静态内联void foo(void)
{
;
}
而且您的bar.c不需要extern-inline-void-foo(void)
,只需调用foo()代码>,它会工作的
至于如果我的内联函数没有像它应该的那样到处内联,我至少会得到某种链接器错误警告我找不到某个引用
编译时必须显式地使用优化选项,这样内联函数才能真正内联<代码>gcc条.c-O2
。您可以使用objdump
检查代码的汇编代码,您会发现内联函数内联,而不是调用foo
,而是内联 那你在说什么?请出示一些代码。若你们想要内联函数,你们需要在头文件中放很多代码。(除非您使用的是链接时间优化,您不需要显式地inline
)是的,我说的是将函数体放在头中。但不是关键字EXTERN。extern声明将发生在需要远程访问此内联函数的每个C文件中。请输入代码和示例。我仍然不理解你的问题。这与。在.h
文件中的静态内联void foo(void){}
有什么问题,其他地方没有更多的声明?这个方法有效-但extern也有效。那么,哪种方法更正确、更便于携带呢?我编辑了我的问题,首先将重点放在“我是否应该跨翻译单元内联函数”上。我认为两者都是正确的,就我所知没有区别,选择简单的一个。我有点困惑,我应该跨翻译单元内联函数吗?1跨翻译单元内联函数是什么意思?你是说穿过普拉特