代码之家  ›  专栏  ›  技术社区  ›  TheLoneJoker

C“inline”关键字的替代项

  •  3
  • TheLoneJoker  · 技术社区  · 14 年前

    从我的课程老师那里,他反复强调并要求我们不要在函数中使用“inline”关键字。他说它不是跨编译器的“可移植的”,也不是“标准的”。考虑到这一点,是否有允许“内联扩展”的“标准”替代方案?

    4 回复  |  直到 14 年前
        1
  •  18
  •   paxdiablo    14 年前

    你的课程老师错了。它 标准。实际上 在里面 现行标准,就在那一节 6.7.4 Function specifiers (C99)。这是对编译器的一个建议,可能会被完全忽略,但这并没有降低它的标准。

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

    然而,即使在 inline 是的,我通常把这些决定留给编译器自己,因为大多数现代的决定都能找出如何最好地优化代码(通常比我好得多)。这个 内联 关键字,例如 register auto ,不是我通常担心的事情。

    可以改用宏,因为这是相对简单的文本替换,通常发生在编译阶段之前,但您应该注意其局限性和缺点。

    或者您可以手动内联代码(即,复制它),但我不建议将其作为一个选项,因为它可能很快成为维护的噩梦。

    我自己,我会用普通函数编写代码 任何 然后在必要的时候介绍这些技巧 只有 如果你能证明它们是必要的,比如某个特定的性能问题)。

    你应该总是假设必须维护你的代码的程序员是一个知道你住在哪里的精神病杀手:-)

        2
  •  2
  •   Jens Gustedt    14 年前

    正如其他人所说, inline 11年前被整合到C标准。

    除注明外, 内联 因为它更改了函数的可见性属性,所以会有所不同。特别是对于只声明了许多函数的大型库 static 您可能有这些函数的一个版本 全部的 对象文件(例如,在打开调试的情况下编译时)。

    请看一下那个帖子: Myth and reality about inline in C99

        3
  •  0
  •   Ignacio Vazquez-Abrams    14 年前

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

        4
  •  0
  •   R.. GitHub STOP HELPING ICE    14 年前

    在这里,现在是“跨编译器移植”:

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

    顺便说一下,正如其他人所说 inline 关键字只是一个提示,没有用,但重要的关键字是 static . 除非你的函数被声明 静止的 ,它将具有外部链接,编译器在自己决定要内联哪些函数时不太可能将其视为内联的候选函数。

    还要注意,与C++不同,C语言不允许。 内联 没有 静止的 .

    推荐文章