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产生应用的副作用或者是每次迭代都被调用的函数.
但是如果你试图封装一个经常被调用的循环,那就把它放在自己独立的函数中.理解和维护更安全,更容易.
由于 C 不要求语句在单独的行上,因此您可以简单地合并为一个长行:
#define M while (...) { ...; ...; }
Run Code Online (Sandbox Code Playgroud)
或者您可以在宏定义中转义换行符:
#define M \
while (...) { \
...; \
...; \
}
Run Code Online (Sandbox Code Playgroud)