[英]define: is there a way to expand arguments?
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))
当然,他们会夸大上面的第一个宏。 这是可能的,如果是的话,怎么样?
答案是:不,海湾合作委员会不能做扩大论证。 C预处理器仅支持2种宏:类似对象的宏和类似函数的宏。 你正在使用的是类似函数的宏。 宏是已赋予名称的代码。 类似函数的宏通过编译器扩展其代码,但要注意这一点,只关注它的代码,而不是它的参数,如果包含其他宏,编译器也将扩展其他宏代码。 GCC的官方页面( https://gcc.gnu.org/),NEVER报告它支持参数扩展,或者我看到你想要的东西,在扩展时功能参数分离。 GCC仅支持正常的宏代码扩展(这是关于支持的宏的具体文章: https : //gcc.gnu.org/onlinedocs/cpp/Macros.html ),因此在扩展时无法进行函数参数分离时间。 但是你可以像你给出的第二个例子那样完美地定义宏,但当然不会进行参数扩展。
一个增强预处理器解决方案可能是
#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迭代限制。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.