C++ 如何获取_计数器的最后一个值__
我有一个宏,它执行以下类似操作:C++ 如何获取_计数器的最后一个值__,c++,c,macros,C++,C,Macros,我有一个宏,它执行以下类似操作: #define MAKE_VALS(...) \ int val1 = 0; \ int val2 = 0; \ : if(val1 == val2) \ { \ ... } 我需要在一个函数中多次使用它。问题是,由于val1和val2的多个定义,多次使用它会导致多个定义错误 使用\uuuu COUNTER\uuuu和##可以解决这个问题,但是我看不出如何为if语句获取正确的变量名?我无法再次使
#define MAKE_VALS(...) \
int val1 = 0; \
int val2 = 0; \
:
if(val1 == val2) \
{ \
...
}
我需要在一个函数中多次使用它。问题是,由于val1和val2的多个定义,多次使用它会导致多个定义错误
使用\uuuu COUNTER\uuuu
和##
可以解决这个问题,但是我看不出如何为if语句获取正确的变量名?我无法再次使用\uuuu计数器,因为我将获得下一个值。我需要一种方法来获取计数器的最后一个值。能做到吗
另外,我不想用{}
s来解决这个问题。我在这里简化了真正的问题,使用{}
s会导致其他问题(这对我的问题并不重要)
使用:
将第二个\uu行\uuu
放在下一行,以避免m
和n
的值相同
使用:
将第二个\uuuu行\uuuuu
放在下一行,以避免m
和n
的值相同。无论出于何种目的,您都可以使用多个级别的宏来实现这一点:
#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\u VALS
,每次调用都将创建一组新的变量。请注意,如果没有MAKE_VALS1
,您的变量将被命名为val1___计数器
,依此类推,额外的级别将使其成为实际数字
这是一个很好的宏观写作练习,但我同意前面的人的观点,他们质疑这是否是实现你想要实现的目标的正确方法。但是关于这一点已经说得够多了,所以我希望这能解决您的问题。无论这是出于什么目的,您都可以使用多个级别的宏来实现这一点:
#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\u VALS
,每次调用都将创建一组新的变量。请注意,如果没有MAKE_VALS1
,您的变量将被命名为val1___计数器
,依此类推,额外的级别将使其成为实际数字
这是一个很好的宏观写作练习,但我同意前面的人的观点,他们质疑这是否是实现你想要实现的目标的正确方法。但是关于这一点已经说得够多了,所以我希望这能解决你的问题。除非你说是什么问题造成的,否则我不会回答。因为这是一个直截了当的解决方案(w/do
)。如果你需要大量的代码来解释它,那么你显然做得不对。@Jan:@litb的问题是正确的,为什么创建局部作用域对你来说是个问题?如果在一个大范围内多次使用MAKE_VALS(),那么宏的一个输入应该是一个数字,然后可以使用标记粘贴来生成两个整数,例如val###number
和val#number####
你能解释一下你想做什么吗(不是你的解决方案想要做什么,而是实际的用例)?为什么你甚至需要将其作为一个宏放在首位?如果这不能用一个(可能是内联的)函数来实现,我会非常惊讶。除非你说是什么问题引起的,否则我不会回答。因为这是直截了当的解决方案(w/do
)。如果您需要大量代码来解释它,那么您显然做了一些错误的事情。@Jan:@litb的问题是正确的,为什么创建本地作用域对您来说是一个问题?如果您使用MAKE_VALS()在大范围内多次,可能宏的一个输入应该是一个数字,然后您可以使用标记粘贴来生成两个整数,例如val###number
和val##number####
您能否解释您正在尝试做什么(不是您的解决方案正在尝试做什么,而是实际的用例)?为什么一开始你甚至需要它是一个宏?如果这不能用一个(可能是内联的)函数来实现,我会非常惊讶。
#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;