【问题标题】:When is it possible to replace a function in C with a macro? [closed]什么时候可以用宏替换 C 中的函数? [关闭]
【发布时间】:2016-04-19 17:52:39
【问题描述】:

作为作业的一部分,我被要求用 C 语言实现一个简单函数列表,并出于运行时效率的原因,尽可能用宏替换这些函数。

是否有一个通用规则可以帮助我确定是否可以用宏替换 C 中的简单函数?为什么这种替换能优化运行时效率?

感谢您的宝贵时间。

编辑:正如这里许多声音所指出的那样,这项任务的目标是在代码质量甚至在某些情况下效率方面适得其反。

【问题讨论】:

  • 过于宽泛且基于意见。但一般来说,除非确实必要,否则不应使用宏。如果有疑问,请使用inline 函数。宏的用途与功能不同。阅读:gcc.gnu.org/onlinedocs/gcc-4.9.3/gcc/Inline.html#Inline
  • @squeamishossifrage:我认为这个问题是针对内联(通过宏,因为 OP 似乎不知道inline)与函数调用。
  • @Pietz:立即离开该课程。导师显然对 C 编程一无所知。我见过很多无意义的作业,但这是最糟糕的作业之一。它有效地教导了糟糕的编码风格。更重要的是,作为一个现代编译器,也很可能内联普通函数。
  • @Pietz 来说明 Olaf(和其他人)的意思,例如看一下 getc() 和其他 stdio 宏的实现。或者 (f)lex 的输出......如果你了解他们的工作,请回来。
  • @Pietz 问问给你这个任务的人是否在本世纪做过任何真正的编程。用宏替换函数是一个非常糟糕的主意,特别是因为我们从 C99 开始就有内联函数(并且在大多数编译器中很久之前)。内联通常会使运行时效率变差,绝对不应该由需要提出此类问题的人尝试。

标签: c performance function replace macros


【解决方案1】:

唯一的一般规则是:尽可能避免使用类似函数的宏,因为它们通常不可读和/或不安全。尽可能使用函数。

类似函数的宏通常只在处理诸如常量、标识符、声明等编译时问题时才有意义。

为了性能而用宏替换函数是您甚至不应该考虑的事情。大约 20 年前曾经是这样,因为那时编译器在优化代码方面非常糟糕,以至于程序员比编译器做得更好。现在是另一种方式,把这些事情留给编译器。

【讨论】:

  • 现在一切都开始变得有意义了。正如我在另一条评论中所说,作业在 C90 中,我的教授显然也是如此。谢谢你的解释。
  • @Pietz 它也与 C90 没有任何关系。有很多 C90 编译器完全能够在不使用关键字的情况下进行函数内联等。事实上,inline 关键字现在大多已过时,因为它假定程序员比编译器更有能力确定内联的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2010-10-03
  • 2016-11-24
  • 2012-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多