【问题标题】:how to make a macro to generate code in a for loop?如何制作宏以在for循环中生成代码?
【发布时间】:2018-09-11 18:59:48
【问题描述】:

我在代码审查中注意到以下代码:

for (int i = 0; i < 50; ++i) {
  switch(i) {
    case 0:
      return f1();
    case 1:
      return f2();
    ...
    case 49:
      return f50();
  }
}

我想知道是否有任何优雅的方式,例如使用宏来简化此代码(将其减少到几行):

谢谢。

【问题讨论】:

  • 这不会简化为调用f1() 并立即返回而不执行任何其他分支吗?
  • 看起来像是 XY 问题。最好的方法是使用函数指针表而不是宏
  • 你真的有五十个名字像f1等等的方法吗?为什么不按顺序运行它们?循环的目的是什么?
  • 正如丹尼尔已经说过的,它将返回 f1() 的结果,并且永远不会循环其他 49 个函数...示例代码是否正确?
  • 几乎总是是错误的解决方案。

标签: c++ c macros c-preprocessor


【解决方案1】:
for (int i = 0; i < 50; ++i) {
  switch(i) {
    case 0:
      return f1();
    ...

可以简化为

return f1();

不需要宏。

【讨论】:

  • 顺便说一句,原始代码中没有错误,只有我在这里发布的简化代码有问题。谢谢指出
  • @TMS 老实说,我不太明白你为什么接受这个答案。 :-)
  • @melpomene,我认为我不应该更正我的帖子,因为帖子中已经有很多关于这个错误的讨论。如果我仍然想正确地问这个问题,我最好开始一个新的。这个答案确实简化了代码,所以它被接受了。
  • 哈哈,我不得不考虑几分钟。不错!
【解决方案2】:

不能有任何 CPP 宏来生成这个,但在 C 或 C++ 中用其他东西来生成东西是常见的做法。例如,您可以用 Python、Ocaml 或 AWK 编写一些生成代码的脚本,这样做是常见的做法(您只需在 Makefile 中添加几行即可)。您还可以使用其他预处理器,例如m4gpp

顺便说一句,在您的情况下,您可以考虑声明一个包含 50 个指针函数的数组,并间接调用它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    • 2023-03-25
    • 2013-11-19
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    相关资源
    最近更新 更多