簡體   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