c++ - 如何获取 __COUNTER__ 的最后一个值

标签 c++ c macros

我有一个执行类似于以下操作的宏:

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

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

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

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

最佳答案

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

#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__ 等等,额外的级别使其成为实际数字。

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

关于c++ - 如何获取 __COUNTER__ 的最后一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6736770/

相关文章:

c++ - C++中对象的动态内存分配

C - 如何在数组中存储多个字符串

c++ - 定义带有添加前缀的新宏的宏

C++在宏中获取宏名称

c++ - 将 uint8_t 与数字进行比较

c++ - 静态常量 vs #define

c++ - 使用 const 成员函数 boost type_erasure any

检查scanf的输入

c - 所有者绘制选项卡控件 - 选项卡项目的文本

emacs - 指定 emacs lisp 宏缩进样式的两种方法之间的区别