将内联函数放在C标头中是否错误?

Lou*_*Lou 5 c inline c-header

我正在为几个编译器构建一个C项目,其中一些是旧式编译器,它们似乎没有链接时间内联支持,因此将static inline函数直接放在标头中并实际上让每个翻译单元都有自己的副本似乎合乎逻辑。

另外,我需要确保内联某些函数,以便在某些低级中断处理程序中调用时不会调用其他函数(即,更改CPU寄存器),因此这不仅仅是让编译器选择是否会影响性能。 。

但是,我的一位同事告诉我,这是一件不寻常的事情,我应该避免这样做。在项目的这一点上,我可能仍然可以重新排列所有内容,所以我想确认如果决定使用标头内联,从长远来看是否还会遇到一些问题?

小智 5

来自 n1570(最新的公开 C11 草案),第 6.7.4 节:

  1. inline函数说明符声明的函数是内联函数。使函数成为内联函数意味着对该函数的调用尽可能快。这些建议的有效程度是由实施定义的。

下一节将详细介绍链接,但是上面的这段话基本上是 C 标准要说的所有内容inline。请注意这如何赋予实现所有自由,包括完全忽略inline.

因此,仅使用标准 C,您最终可能会得到以正常方式调用的函数的多个实例(每个翻译单元一个)。这通常不是您想要的,因为它结合了两个缺点(重复的代码函数调用的开销)。所以我认为标准 Cinline只对单个翻译单元私有的函数有用。即便如此,您也可以假设一个好的优化编译器会自动选择内联的候选对象,而无需显式inline.

另一方面,如果您的编译器提供了一种实际强制内联函数的方法(根据您的评论,说明_inline符为您的编译器提供了这种方法),则将这些函数放在头文件中是安全的。但请注意,它绝不是便携式的。

正如cmaster评论的 那样,您可以使用类似函数的宏来实现“手动内联”,而不是便携式解决方案。