宏中循环变量的唯一名称

Mig*_*ork 1 c macros

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

#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)

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

有什么办法在宏中生成唯一的变量名?

Har*_*ind 6

一些编译器支持__COUNTER__可用于帮助避免变量阴影的宏变量(您仍需要添加足够唯一的前缀).

举例来自:http://rentzsch.tumblr.com/post/12960046342/nearly-hygienic-c-macros-via-counter

我们的想法是创建一个宏,它接受要使用的变量名后缀,然后使用传入的第二个宏来包装它 __COUNTER__以生成唯一的后缀.


das*_*ght 5

此问题的常见解决方法是将变量的名称传递给宏:

#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)

演示.