如何获取__COUNTER__的最后一个值

How to get the last value of __COUNTER__

本文关键字:COUNTER 最后一个 何获取 获取      更新时间:2023-10-16

我有一个宏,做了类似下面的事情:

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

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

使用__COUNTER__##将解决问题,但我看不出如何为if语句获得正确的变量名称?我不能再用__COUNTER__了,因为我会得到下一个值。我需要一种方法来得到__COUNTER__的最后值。这能做到吗?

p。我不想用{} s来解决这个问题。我已经简化了这里的实际问题,使用{} s会导致其他问题(这对我的问题并不重要)。

无论这样做的目的是什么,您都可以使用几个级别的宏来实现:

#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__,以此类推,并且额外的级别使其成为实际数字。

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

#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的值相同。