这可能不是"最佳实践",但我想添加自定义循环语句:
#define repeat(count) for(int _repeat_i = 0; _repeat_i < (count); _repeat_i++)
Run Code Online (Sandbox Code Playgroud)
然后这将工作正常:
repeat(5) {
do_stuff();
}
Run Code Online (Sandbox Code Playgroud)
但我无法筑巢:
repeat(5) {
do_big_stuff();
repeat(3) {
do_little_stuff();
}
}
Run Code Online (Sandbox Code Playgroud)
...因为变量名称会发生冲突.
有什么办法在宏中生成唯一的变量名?
一些编译器支持__COUNTER__可用于帮助避免变量阴影的宏变量(您仍需要添加足够唯一的前缀).
举例来自:http://rentzsch.tumblr.com/post/12960046342/nearly-hygienic-c-macros-via-counter
我们的想法是创建一个宏,它接受要使用的变量名后缀,然后使用传入的第二个宏来包装它 __COUNTER__以生成唯一的后缀.
此问题的常见解决方法是将变量的名称传递给宏:
#define repeat(v,count) for(int v = 0; v < (count); v++)
Run Code Online (Sandbox Code Playgroud)
现在你可以编写类似的内容repeat(i,5)并repeat(j,3)避免重新定义变量.
您还可以使用__LINE__组合变量名称,如下所示:
#define repeat(count) for(int _repeat_##__LINE__ = 0; _repeat_##__LINE__ < (count); _repeat_##__LINE__++)
Run Code Online (Sandbox Code Playgroud)
这并不理想,因为repeat(...)同一行上的两个语句会产生错误.
但是,对于大多数实际用途,这个宏将完成这项工作:
repeat(2) {
repeat(3) {
printf("hello\n");
}
}
Run Code Online (Sandbox Code Playgroud)