在C宏中模拟范围

tle*_*man 3 c macros scope

我有以下宏来打印出一个整数数组的内容用于调试目的:

#define PRINT_ARRAY(ary, num)        \
    int ai = 0;                      \
    printf("{");                     \
    for(ai=0; ai < num; ++ai) {      \
        printf("%d", ary[ai]);       \
        if(ai < num-1) printf(", "); \
    }                                \
    printf("}\n");
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,当我不止一次使用它时,一些编译器抱怨我正在重新定义ai.

有没有办法使宏标识符的每次调用都不同?我可以提出一个名称冲突变化非常小的命名方案,但我想让它自动化.

我知道我可以使用一个函数,但我仍然很好奇,因为我想知道是否有办法用宏来做这个.

小智 6

你为什么不使用经典的do-while技巧?例如:

#define FOO(EXPR) \
  do { \
    (EXPR); \
  } while(0)
Run Code Online (Sandbox Code Playgroud)