为了调试目的,我有以下宏来打印整数数组的内容:
#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
。
是否有办法使标识符在每次调用宏时有所不同?我可以想出一个命名方案,它的名称冲突变化很小,但我想让它自动发生。
我知道我可以使用一个函数,但我仍然很好奇,因为我想知道是否有一种使用宏的方法。
发布于 2013-12-07 22:50:18
你可以把它放到它自己的范围里,例如用{
和}
包围它
如下所示:
#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)
构造,这样您的宏就变成了:
#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)
发布于 2013-12-07 22:51:53
你为什么不用经典的“边玩边玩”的把戏呢?例如:
#define FOO(EXPR) \
do { \
(EXPR); \
} while(0)
发布于 2013-12-07 22:51:07
如果您的C符合C99,请将ai
的声明放在for
循环的头中。
#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)
这样,它就可以在控制结构之后使用,而不用花括号包围它。
https://stackoverflow.com/questions/20447661
复制相似问题