繁体   English   中英

在其参数的结构上重载C / C ++预处理器宏

[英]Overload C/C++ preprocessor macro on structure of its argument

我想编写一个预处理器宏,如果它的参数是带括号的标记元组,它会做一件事,如下所示:

MY_MACRO((x, y))

如果它只是一个令牌,还有其他东西,如下所示:

MY_MACRO(x)

那可能吗?

如何区分空格分隔的标记数,即MY_MACRO(x)MY_MACRO(xy)

请注意,我不是试图根据参数的数量重载 - 它在所有情况下都是一元宏。

编辑 :如果他们有所帮助,我愿意使用可变参数宏

至于您的第一个问题,以下宏可能符合您的目的:

#define CONCAT_( x, y ) x ## y
#define CONCAT( x, y ) CONCAT_( x, y )
#define IS_SINGLE_1(...) 0
#define IGNORE(...)
#define IS_SINGLE_2_0           0 IGNORE(
#define IS_SINGLE_2_IS_SINGLE_1 1 IGNORE(
#define IS_SINGLE( x ) CONCAT( IS_SINGLE_2_, IS_SINGLE_1 x ) )
IS_SINGLE((x, y)) // 0
IS_SINGLE(x)      // 1

如果参数是单个标记,则宏IS_SINGLE扩展为1,否则为0。

希望这可以帮助

使用boost.preprocessor

#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/seq/for_each.hpp>

#define SEQ (w)(x)(y)(z)

#define MACRO(r, data, elem) BOOST_PP_CAT(elem, data)

BOOST_PP_SEQ_FOR_EACH(MACRO, _, SEQ) // expands to w_ x_ y_ z_

即使单个参数案例需要括号,它也不完全相同。 但它确实允许可变数量的带括号的参数。

还有一种可能性:使用BOOST_PP_IF,BOOST_PP_EQUAL和BOOST_PP_TUPLE_ELEM来执行以下操作:

MACRO(1, a)
MACRO(2, (a,b) )
MACRO(3, (a,b,c) )

或者。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM