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

HC4*_*ica 6 c c++ overloading c-preprocessor

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

MY_MACRO((x, y))
Run Code Online (Sandbox Code Playgroud)

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

MY_MACRO(x)
Run Code Online (Sandbox Code Playgroud)

那可能吗?

如何区分空格分隔的标记的数量,即MY_MACRO(x)MY_MACRO(x y)?之间?

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

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

Ise*_*ria 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
Run Code Online (Sandbox Code Playgroud)

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

希望这可以帮助

  • 对于空间分离,这是不可能的.对于逗号分隔,有一个解决方案,可以对参数个数进行任何有界限制. (2认同)