如何获取__COUNTER__的最后一个值

时间:2011-07-18 17:25:13

标签: c++ c macros

我有一个类似于以下内容的宏:

#define MAKE_VALS(...) \
    int val1 = 0; \
    int val2 = 0; \
    :
    if(val1 == val2) \
    { \
        ... 
    }

我需要在一个函数中多次使用它。问题是,由于val1和val2的多个定义,多次使用会导致多个定义错误。

__COUNTER__##一起使用可以解决问题,但我无法看到如何为if语句获取正确的变量名称?我无法再次使用__COUNTER__,因为我获得了下一个值。我需要一种方法来获取__COUNTER__的最后一个值。可以吗?

PS。我不想用{}来包围它以解决问题。我已经在这里简化了真正的问题,使用{}会导致其他问题(这对我提出的要求并不重要)。

2 个答案:

答案 0 :(得分:3)

无论出于何种目的,您都可以使用多个级别的宏来实现:

#define MAKE_VALS(...) MAKE_VALS1(..., __COUNTER__)
#define MAKE_VALS1(..., counter) MAKE_VALS2(..., counter)
#define MAKE_VALS2(..., counter) \
   int val1##counter = 1; int val2##counter = 2; \
   val1##counter = whatever; val2##counter = hunoz;

这样,您可以在同一范围内多次使用MAKE_VALS,每次调用都会创建一组新的变量。请注意,如果没有MAKE_VALS1,您的变量将被命名为val1__COUNTER__,依此类推,额外的级别会使其成为实际数字。

在宏观写作中这是一个很好的练习,但我同意我之前的人,他们质疑这是否是实现你想要达到的目标的正确方法。但是已经有足够的说法,所以我希望这能解决你的问题。

答案 1 :(得分:2)

#define MAKE_VALS(m, n, ...) \
    int val ## m = 0; \
    int val ## n = 0; \
    :
    if(val ## m == val ## n) \
    { \
        ... 
    }

使用:

 MAKE_VALS(__LINE__,
           __LINE__, ... ); //second __LINE__ on next line

将第二个__LINE__放在下一行,以避免mn具有相同的值。