C语言“inline”关键字的替代方案

4

我的课程讲师多次强调并要求我们不要在函数中使用 "inline" 关键字。他说它在编译器之间不是“可移植”的,也不是“标准”的。考虑到这一点,是否有任何“标准”替代方案可以实现“内联扩展”?


2
虽然,真的有必要使用 inline 吗?如果我是一位讲师,那就是我会警告的内容——“优化”。 - user166390
4个回答

19

你的课程讲师是错误的。它是标准的。实际上,在当前标准中的第6.7.4节“函数说明符”(C99)中就有。它被建议给编译器,但可能会被完全忽略这一事实并不会使其变得不标准。

我认为它不在C89/90中,这可能是一些嵌入式编译器使用的版本,但在这种情况下,我会认真考虑升级。

然而,即使有inline可用,我通常也将这些决策留给编译器本身,因为现代大多数编译器都能够更好地优化代码(通常比我自己更好)。像registerauto一样,inline关键字不是我通常担心的东西。

您可以改用宏,因为这是相对简单的文本替换,通常发生在编译阶段之前,但您应该了解限制和问题。

或者您可以手动内联代码(即复制它),尽管我不建议这样做,因为它可能很快成为维护噩梦。

对于我自己,我会使用普通函数编写代码,而不使用任何这些技巧,然后在必要时引入它们(仅当您可以证明需要它们时,例如特定性能问题)。

您应该始终假设必须维护您的代码的程序员是一个知道您住址的精神病杀手 :-)


6
重要的是要记住,即使“inline”关键字是标准的,编译器现在已经变得比我们大多数人聪明。你的教授可能想表达的是,你根本不应该自己做出这些决定,而是让编译器决定何时最合适。 - Cody Gray
1
我们在哪里可以找到一个好的链接来解释所有这些问题?我是另一个学生。 - user418748
1
请不要仅仅因为其名称而使用 inline 关键字。它不仅是编译器的提示,还可以改变函数符号的可见性。如果您设计具有许多内联函数的大型库,则这是一个重要功能。 - Jens Gustedt
1
@pax:我曾经遇到过函数过度内联的问题,导致生成的代码大小超出了处理器L1缓存的容量。通过强制取消内联(这是一门黑艺术!)来进行反优化,对已经相当彻底调整过的代码产生了相当不错的改进效果... - Donal Fellows
只是想指出,Visual Studio C编译器不符合C99标准,也不支持inline关键字。它支持"__inline"关键字,或者你可以使用他们的C++编译器进行编译。 - Darryl
显示剩余3条评论

2
正如其他人所说的,inline已经在11年前被整合到C标准中。
除了被指出的之外,inline会改变函数的可见性属性。特别是对于有很多只声明为static的函数的大型库,你可能会在所有目标文件中都有这些函数的一个版本(例如在打开调试时编译)。
请参阅此文章:关于C99中inline的神话和现实

0

虽然它们可能很邪恶,但是宏仍然是王者(尽管特定的编译器可能支持额外的功能)。


0

现在,它已经“跨编译器可移植”了:

#if (__STDC_VERSION__ < 199901L)
#define inline
#endif
static inline int foobar(int x) /* ... */

顺便提一下,正如其他人所说,inline关键字只是一个提示,而且相当无用,但重要的关键字是static。除非您的函数声明为static,否则它将具有外部链接性,并且编译器不太可能在自己决定哪些函数内联时将其视为候选函数。 < p >还要注意,与C++不同,C语言不允许没有staticinline


@R.: 没有static就不能使用inline?你是怎么得出这个结论的?对于不符合标准的编译器(如gcc pre-4.3),很难在没有static的情况下使用inline。但对于符合标准的编译器,在头文件中使用inline,并在一个编译单元中使用一个额外的声明而不使用inline来实例化函数应该可以解决问题。 - Jens Gustedt
@Jens:这种行为并没有被C语言规定。它是从C++编译器的滥用。 - R.. GitHub STOP HELPING ICE
@R.: 是的,当一个定义是内联定义还是不是,在标准中是明确指定的。请阅读标准。 - Jens Gustedt
@R.:我已经写好了我的观点。如果你愿意,可以在我的帖子中找到链接。 - Jens Gustedt
对于 C89 和 C90,__STDC_VERSION__ 未定义。如果您使用这些标准进行编译,则会使用未声明的标识符。 - Giuppox
@Giuppox:没问题。在预处理条件中,未定义会扩展为0 - R.. GitHub STOP HELPING ICE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接