从我的课程讲师,他反复强调并要求我们不要使用“内联”关键字来实现功能。他说它不是编译器的“可移植”而不是“标准”。考虑到这一点,是否存在允许“内联扩展”的“标准”替代方案?
答案 0 :(得分:18)
你的课程讲师错了。 是标准。它实际上是 in 当前标准,就在6.7.4 Function specifiers
(C99)部分。事实上,对编译器的建议可能完全被忽略,这并不会使它变得不那么标准。
我认为它不是在C89 / 90中可能是某些嵌入式编译器使用的,但我会在这种情况下将严重的考虑进行升级。
然而,即使inline
可用,我通常会将这些决定留给编译器本身,因为大多数现代的决策都能够找出如何最好地优化代码(通常比我好得多)。 inline
关键字,例如register
和auto
,通常不会让我担心。
您可以使用宏,因为这是相对简单的文本替换,通常在编译阶段之前发生,但您应该了解这些限制和缺陷。
或者您可以手动内联代码(即复制代码),但我不建议将其作为选项,因为它很快就会成为维护的噩梦。
我自己,我会使用普通函数编写代码而不使用任何这些技巧,然后在必要时引入它们(如果你能证明它们是需要的话,只能 ,例如特定的性能问题)。
你应该总是假设必须维护你的代码的编码员是一个知道你住在哪里的心理变态杀手: - )
答案 1 :(得分:2)
正如其他人所说,11年前,inline
被纳入了C标准。
除了指示之外,inline
会有所不同,因为它会更改函数的可见性属性。特别是对于具有许多仅声明static
的函数的大型库,您可能在所有目标文件中具有任何这些函数的一个版本(例如,当您打开调试时编译)。
答案 2 :(得分:0)
尽管它们可能是邪恶的,但宏仍然是王道(虽然特定的编译器可能支持额外的功能)。
答案 3 :(得分:0)
现在,它“可以跨编译器移植”:
#if (__STDC_VERSION__ < 199901L)
#define inline
#endif
static inline int foobar(int x) /* ... */
顺便说一下,正如其他人所说的那样,inline
关键字只是一个提示而且毫无用处,但重要的关键字是static
。除非你的函数被声明为static
,否则它将具有外部链接,并且当编译器自己决定内联哪些函数时,编译器不太可能认为它是内联的候选者。
另请注意,与C ++不同,C语言不允许 inline
没有static
。