fordefine指令中的for或while循环

时间:2011-04-22 20:39:29

标签: c for-loop c-preprocessor

如何在C语言的for指令中编写while / #define循环?

6 个答案:

答案 0 :(得分:10)

您可能正在寻找\来跨多行继续宏定义:

#define LOOP(start, end)                  \
  for (int i = (start); i < (end); i++) { \
    printf("%d\n", i);                    \
  }

答案 1 :(得分:9)

简短回答是“不要”。但如果你拥有,为了所有神圣的爱不要这样做:

#define FOREACH(start, end)                         \
      for (; (start) < (end); (start)++)            \
      {                                             \
        // do something interesting                 \
      }                                             

Bad juju一路走来。请注意,start 必须对应左值;您无法将其称为FOREACH(1,10)FOREACH((a+b), c)FOREACH(x++,y++)。所有这些都会导致编译时错误(++的操作数必须是左值,而1a+bx++都不符合条件。将其称为FOREACH(x, y++)将执行真正不希望它执行的操作。同样,您也不希望将其称为FOREACH(x, y())

您可以通过执行类似

之类的操作来防范这些问题
#define FOREACH(start, end)                        \
do {                                               \
  int i;                                           \
  int j = end;                                     \
  for (i = start; i < j; i++)  {                   \ 
    // do something interesting                    \
  }                                                \
} while (0)

基本上,您正在创建与宏参数对应的局部变量。这可以防止start不是左值,反对end具有应用的副作用或者是每次迭代调用的函数。

但是如果你试图封装一个经常调用的循环,将它放在自己独立的函数中。理解和维护更安全,更容易。

答案 2 :(得分:4)

#define something for(;;) printf("hooray, i'm in infinite loop!");


int main() { something }

答案 3 :(得分:4)

由于C不要求语句在单独的行上,您可以简单地一起刷成一行:

#define M while (...) { ...; ...; }

或者您可以在宏定义中转义换行符:

#define M \
  while (...) { \
    ...; \
    ...; \
  }

答案 4 :(得分:2)

#define foo(x) do { \
    for(x=0;x<4;x++) x; \
    } while(0) // note lack of trailing ;

或在gnu c:

#define foo(x) ({ \
    for(x=0;x<4;x++) x; \
    })

后者可以用作表达式,虽然这个类型为void,因此不是很有用。

答案 5 :(得分:1)

这对于循环来说是更通用的

#include <stdio.h>
#include <string.h>

#define for_loop(start, end, incr) for(i = start; \
                                        i < end;  \
                                         i += incr)

int main()
{
  int i=0, j=5;

  for_loop(i, j, 1)
    printf("%d\n", i+1);

  return 0;
}