首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C宏中的模拟范围

C宏中的模拟范围
EN

Stack Overflow用户
提问于 2013-12-07 22:48:10
回答 3查看 71关注 0票数 3

为了调试目的,我有以下宏来打印整数数组的内容:

代码语言:javascript
运行
复制
#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");

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

是否有办法使标识符在每次调用宏时有所不同?我可以想出一个命名方案,它的名称冲突变化很小,但我想让它自动发生。

我知道我可以使用一个函数,但我仍然很好奇,因为我想知道是否有一种使用宏的方法。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-07 22:50:18

你可以把它放到它自己的范围里,例如用{}包围它

如下所示:

代码语言:javascript
运行
复制
#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");                   \
}

我还在num参数周围添加了parantheses,所以您可以使用复杂的表达式,而不会产生奇怪的副作用。

WRT到您的标识符命名:

您可以使用宏展开来使用参数更改名称,但由于我知道的所有c++预处理程序中都没有计数器或循环结构,所以我认为不可能在每个用户之后自动更改标识符。另一种方法是每次重新定义宏,但afaik也不可能。

编辑:

正如已经指出的(感谢Aaron,还可以看到他所介绍的链接:https://stackoverflow.com/a/1067238/146041),您应该在代码周围使用do { } while(0)构造,这样您的宏就变成了:

代码语言:javascript
运行
复制
#define PRINT_ARRAY(ary, num)        \
do {                                \
    int ai = 0;                      \
    printf("{");                     \
    for(ai=0; ai < (num); ++ai) {      \
        printf("%d", ary[ai]);       \
        if(ai < (num)-1) printf(", "); \
    }                                \
    printf("}\n");                   \
} while(0)
票数 2
EN

Stack Overflow用户

发布于 2013-12-07 22:51:53

你为什么不用经典的“边玩边玩”的把戏呢?例如:

代码语言:javascript
运行
复制
#define FOO(EXPR) \
  do { \
    (EXPR); \
  } while(0)
票数 6
EN

Stack Overflow用户

发布于 2013-12-07 22:51:07

如果您的C符合C99,请将ai的声明放在for循环的头中。

代码语言:javascript
运行
复制
#define PRINT_ARRAY(ary, num)        \
    do {printf("{");                     \
    for(int ai=0; ai < num; ++ai) {      \
        printf("%d", ary[ai]);       \
        if(ai < num-1) printf(", "); \
    }                                \
    printf("}\n"); } while(0)

这样,它就可以在控制结构之后使用,而不用花括号包围它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20447661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档