繁体   English   中英

使用 C 预处理器生成嵌套的 for 循环

[英]Generate nested for loops using C preprocessor

我想生成嵌套的 for 循环,而不是使用 C 预处理器使用递归。 这个循环结构的深度是有界的。 深度为 3 的嵌套 for 循环示例如下:

for (int i = 0; i < m; i++) {
  for (int j = 0; j < n; j++) {
    for (int k = 0; k < p; k++) {
      // do_computation()
    }
  }
}

深度可以在 2 到 10 之间。我有许多do_computation()函数的变体,因此使用函数组合手动编写每个深度的代码会使代码看起来臃肿。 堆栈溢出中的一些答案指向使用 boost 预处理器,但不幸的是,我将无法在我的应用程序中包含 boost。

拥有#define MAKE_N_LOOP() 会很棒!

首先为每个参数计数生成MAKE_LOOP_#宏重载。 然后编写一个MAKE_LOOP宏,该宏在重定向到每个重载的参数数量上重载。

#include <stdio.h>

#define MAKE_LOOP_2(i, mi)   for(int i = 0; i < mi; ++i)
#define MAKE_LOOP_4(i, mi, ...)  MAKE_LOOP_2(i, mi) MAKE_LOOP_2(__VA_ARGS__)
#define MAKE_LOOP_6(i, mi, ...)  MAKE_LOOP_2(i, mi) MAKE_LOOP_4(__VA_ARGS__)
#define MAKE_LOOP_8(i, mi, ...)  MAKE_LOOP_2(i, mi) MAKE_LOOP_8(__VA_ARGS__)
// etc.
#define MAKE_LOOP_N(_8,_7,_6,_5,_4,_3,_2,_1,N,...) MAKE_LOOP_##N
#define MAKE_LOOP(...)  MAKE_LOOP_N(__VA_ARGS__,8,7,6,5,4,3,2,1)(__VA_ARGS__)

int main() {
   MAKE_LOOP(i, 5, j, 4, k, 10) {
       printf("%d-%d-%d\n", i, j, k);
   }
}

您可能还对在 C 中运行时生成嵌套循环感兴趣。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM