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