define:有没有办法扩展参数?

时间:2017-09-27 08:21:18

标签: c++ c

T()是一个宏

我有很多事情:

MACRODOWN(T(P), T(E), T(X), T(R), T(T), T(H), T(A), T(F))
MACRODOWN(T(H), T(A), T(F))
MACRODOWN(T(Z), T(A))

我想定义一个像这样工作的宏:

MACRODOWN(TT(P,E,X,R,T,H,A,F))
MACRODOWN(TT(H,A,F))
MACRODOWN(TT(Z,A))

当然,他们会夸大上面的第一个宏。 这是可能的,如果是的话,怎么样?

2 个答案:

答案 0 :(得分:0)

答案是:不,海湾合作委员会不能进行争论扩张。 C预处理器仅支持2种宏:类似对象的宏和类似函数的宏。你正在使用的是类似函数的宏。宏是已赋予名称的代码。类似函数的宏通过编译器扩展其代码,但要注意这一点,只关注它的代码,而不是它的参数,如果包含其他宏,编译器也将扩展其他宏代码。 GCC的官方页面(https://gcc.gnu.org/),从未报告它支持参数扩展,或者我看到你想要的东西,在扩展时进行函数参数分离。 GCC仅支持正常的宏代码扩展(这是关于支持的宏的特定文章:https://gcc.gnu.org/onlinedocs/cpp/Macros.html),因此在扩展时无法进行函数参数分离。但是你可以像你给出的第二个例子那样完美地定义宏,但当然不会进行参数扩展。

答案 1 :(得分:0)

增强预处理器解决方案可能

#include <boost/preprocessor/variadic/to_seq.hpp>
#include <boost/preprocessor/seq/enum.hpp>
#include <boost/preprocessor/seq/transform.hpp>


#define TT(...) BOOST_PP_SEQ_ENUM( BOOST_PP_SEQ_TRANSFORM( TT_, _, BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__) ) )
#define TT_(_1,_2,E) T(E)

TT(A,B,C,D) // T(A),T(B),T(C),T(D)

假设可变参数支持和增强pp迭代限制。