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

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

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  #include  #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) ) 

或者。