我想编写一个预处理程序宏,如果它的参数是带括号的标记元组,它会做一件事,如下所示:
MY_MACRO((x, y))
和其他东西,如果它只是一个令牌,如下:
MY_MACRO(x)
这可能吗?
如何区分空格分隔的标记数,即MY_MACRO(x)
和MY_MACRO(x y)
之间?
请注意,我并不是试图根据参数的数量进行重载 - 在所有情况下都是一元宏。
编辑:如果他们帮忙,我愿意使用可变参数宏
答案 0 :(得分:7)
关于您的第一个问题,以下宏可能符合您的目的:
#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。
希望这有帮助
答案 1 :(得分:2)
使用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) )
左右。