Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何获取_计数器的最后一个值___C++_C_Macros - Fatal编程技术网

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;