由未评估的其他宏的评估产生的宏

时间:2016-08-15 13:07:22

标签: boost macros c-preprocessor boost-preprocessor

我对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()宏。 我的问题是为什么,我如何强迫它进行评估?

1 个答案:

答案 0 :(得分:1)

我明白了。要强制进行另一次评估,我需要做的是添加一个虚拟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)))