宏中循环变量的唯一名称

时间:2014-12-25 23:17:54

标签: c macros

这可能不是"最佳做法",但我想添加自定义循环语句:

#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();
    }
}

...因为变量名称会发生​​冲突。

如何在宏中生成唯一的变量名?

3 个答案:

答案 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");
    }
}

Demo.

答案 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__来生成唯一的变量名。