fordefine指令中的for或while循环

har*_*ari 11 c for-loop c-preprocessor

如何在C中的指令中编写for/ whileloop #define

Jar*_*Par 11

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

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


Joh*_*ode 10

简短的回答是"不要".但是如果你必须这样做,因为对所有神圣之爱的爱要这样做:

#define FOREACH(start, end)                         \
      for (; (start) < (end); (start)++)            \
      {                                             \
        // do something interesting                 \
      }                                             
Run Code Online (Sandbox Code Playgroud)

坏juju一路走来.注意,start 必须对应左值; 你不能称之为FOREACH(1,10),或FOREACH((a+b), c),或FOREACH(x++,y++).所有这些会导致编译时错误(的操作数++必须是一个左值,没有的1,a+b或者x++有资格).把它称为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)
Run Code Online (Sandbox Code Playgroud)

基本上,您正在创建与宏参数对应的局部变量.这可以防止start不是左值,并且防止end产生应用的副作用或者是每次迭代都被调用的函数.

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


Tho*_*son 5

由于 C 不要求语句在单独的行上,因此您可以简单地合并为一个长行:

#define M while (...) { ...; ...; }
Run Code Online (Sandbox Code Playgroud)

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

#define M \
  while (...) { \
    ...; \
    ...; \
  }
Run Code Online (Sandbox Code Playgroud)