我的课程讲师多次强调并要求我们不要在函数中使用 "inline" 关键字。他说它在编译器之间不是“可移植”的,也不是“标准”的。考虑到这一点,是否有任何“标准”替代方案可以实现“内联扩展”?
我的课程讲师多次强调并要求我们不要在函数中使用 "inline" 关键字。他说它在编译器之间不是“可移植”的,也不是“标准”的。考虑到这一点,是否有任何“标准”替代方案可以实现“内联扩展”?
你的课程讲师是错误的。它是标准的。实际上,在当前标准中的第6.7.4节“函数说明符”(C99)中就有。它被建议给编译器,但可能会被完全忽略这一事实并不会使其变得不标准。
我认为它不在C89/90中,这可能是一些嵌入式编译器使用的版本,但在这种情况下,我会认真考虑升级。
然而,即使有inline
可用,我通常也将这些决策留给编译器本身,因为现代大多数编译器都能够更好地优化代码(通常比我自己更好)。像register
和auto
一样,inline
关键字不是我通常担心的东西。
您可以改用宏,因为这是相对简单的文本替换,通常发生在编译阶段之前,但您应该了解限制和问题。
或者您可以手动内联代码(即复制它),尽管我不建议这样做,因为它可能很快成为维护噩梦。
对于我自己,我会使用普通函数编写代码,而不使用任何这些技巧,然后在必要时引入它们(仅当您可以证明需要它们时,例如特定性能问题)。
您应该始终假设必须维护您的代码的程序员是一个知道您住址的精神病杀手 :-)
inline
关键字。它不仅是编译器的提示,还可以改变函数符号的可见性。如果您设计具有许多内联函数的大型库,则这是一个重要功能。 - Jens Gustedtinline
已经在11年前被整合到C标准中。inline
会改变函数的可见性属性。特别是对于有很多只声明为static
的函数的大型库,你可能会在所有目标文件中都有这些函数的一个版本(例如在打开调试时编译)。虽然它们可能很邪恶,但是宏仍然是王者(尽管特定的编译器可能支持额外的功能)。
现在,它已经“跨编译器可移植”了:
#if (__STDC_VERSION__ < 199901L)
#define inline
#endif
static inline int foobar(int x) /* ... */
inline
关键字只是一个提示,而且相当无用,但重要的关键字是static
。除非您的函数声明为static
,否则它将具有外部链接性,并且编译器不太可能在自己决定哪些函数内联时将其视为候选函数。
< p >还要注意,与C++不同,C语言不允许没有static
的inline
。static
就不能使用inline
?你是怎么得出这个结论的?对于不符合标准的编译器(如gcc pre-4.3),很难在没有static
的情况下使用inline
。但对于符合标准的编译器,在头文件中使用inline
,并在一个编译单元中使用一个额外的声明而不使用inline
来实例化函数应该可以解决问题。 - Jens Gustedt__STDC_VERSION__
未定义。如果您使用这些标准进行编译,则会使用未声明的标识符。 - Giuppox0
。 - R.. GitHub STOP HELPING ICE
inline
吗?如果我是一位讲师,那就是我会警告的内容——“优化”。 - user166390