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