评估其他未评估的宏所产生的宏
Macro resulting from evaluation of other macros not evaluated
我对 C 预处理器的工作方式有疑问。我写了下面的代码。当使用 OPREP(n)
时,结果应该是这样的:
OP(0,OP(1,OP(2,OP(3, .... OP(n,
。然后我想要实现的是当我添加 whatever)))))))
和 n
右括号之类的东西时,我应该得到
OP(0,OP(1,OP(2,OP(3, .... OP(n,whatever)))))))
应该评估为
0 1 2 3 4 5 .... n whatever
.
#include <boost/preprocessor/comma.hpp>
#include <boost/preprocessor/repetition/repeat.hpp>
#include <boost/preprocessor/punctuation/paren.hpp>
#define OP(a,b) a b
#define T0() OP
#define OPMAC(z,n,s) T0()BOOST_PP_LPAREN() n BOOST_PP_COMMA()
#define OPREP(n_) BOOST_PP_REPEAT(n_, OPMAC, a)
OPREP(2) 3))
当我编译并查看预处理器输出时,我得到:
OP( 0 , OP( 1 , 3))
。也就是说它没有评估生成的 OP() 宏。
我的问题是为什么,以及如何强制对其进行评估?
我明白了。要强制进行另一次评估,我需要做的就是添加一个虚拟 FORCE_EVAL
宏,该宏的计算结果与其参数相同,并将我的调用包含在其中:
#include <boost/preprocessor/comma.hpp>
#include <boost/preprocessor/repetition/repeat.hpp>
#include <boost/preprocessor/punctuation/paren.hpp>
#define OP(a,b) a b
#define T0() OP
#define OPMAC(z,n,s) T0()BOOST_PP_LPAREN() n BOOST_PP_COMMA()
#define OPREP(n_) BOOST_PP_REPEAT(n_, OPMAC, a)
#define FORCE_EVAL(...) __VA_ARGS__
FORCE_EVAL(OPREP(2) 3)))
我对 C 预处理器的工作方式有疑问。我写了下面的代码。当使用 OPREP(n)
时,结果应该是这样的:
OP(0,OP(1,OP(2,OP(3, .... OP(n,
。然后我想要实现的是当我添加 whatever)))))))
和 n
右括号之类的东西时,我应该得到
OP(0,OP(1,OP(2,OP(3, .... OP(n,whatever)))))))
应该评估为
0 1 2 3 4 5 .... n whatever
.
#include <boost/preprocessor/comma.hpp>
#include <boost/preprocessor/repetition/repeat.hpp>
#include <boost/preprocessor/punctuation/paren.hpp>
#define OP(a,b) a b
#define T0() OP
#define OPMAC(z,n,s) T0()BOOST_PP_LPAREN() n BOOST_PP_COMMA()
#define OPREP(n_) BOOST_PP_REPEAT(n_, OPMAC, a)
OPREP(2) 3))
当我编译并查看预处理器输出时,我得到:
OP( 0 , OP( 1 , 3))
。也就是说它没有评估生成的 OP() 宏。
我的问题是为什么,以及如何强制对其进行评估?
我明白了。要强制进行另一次评估,我需要做的就是添加一个虚拟 FORCE_EVAL
宏,该宏的计算结果与其参数相同,并将我的调用包含在其中:
#include <boost/preprocessor/comma.hpp>
#include <boost/preprocessor/repetition/repeat.hpp>
#include <boost/preprocessor/punctuation/paren.hpp>
#define OP(a,b) a b
#define T0() OP
#define OPMAC(z,n,s) T0()BOOST_PP_LPAREN() n BOOST_PP_COMMA()
#define OPREP(n_) BOOST_PP_REPEAT(n_, OPMAC, a)
#define FORCE_EVAL(...) __VA_ARGS__
FORCE_EVAL(OPREP(2) 3)))