c++ - C++ 是一種將宏名作為參數傳遞給嵌套宏的方法,如果最外面的宏展開,則?

  显示原文与译文双语对照的内容
105 3

( 對這個長標題很抱歉,但是我不能想到一個足夠明確的標題。)

我需要將( 對象) 宏的名稱傳遞給嵌套的( 函數) 宏,如下面的( trivial ) 示例所示:

#define ROOT_FUNC(INPUT) int v_ ## INPUT = INPUT
#define CALLER_FUNC(INPUT) ROOT_FUNC(INPUT)
#define INTA 1
#define INTB 2
#define INTC 3

現在,如果在代碼中寫 ROOT_FUNC(INTA);,我得到一個名為 v_INTA的整型變數,。如果我在代碼中定義一個變數int INTD = 4;,然後寫入 CALLER_FUNC(INTD);,然後使用一個名為 v_INTD的整數變數,它的值為 4

但是如果我寫 CALLER_FUNC(INTA);,得到一個整型變數,它的值為 1,因為 INTA 在擴展時擴展到 1,在擴展之前擴展( 例如 ) 。ROOT_FUNC(1) 是什麼。

如果將第 2行改為:#define CALLER_FUNC(INPUT) ROOT_FUNC(#INPUT)由於要求定義一個名為 v_"1" ( 無效名稱)的整數變數,併為它的提供值 "1" ( 非整數值),會出現編譯器錯誤( 例如 。stringifying INPUT ) 。

我知道預處理器是相當原始的,但是有什麼方法可以實現我所追求的?

( 為了進一步澄清,我希望 CALLER_FUNC(INTA); 先擴展到 ROOT_FUNC(INTA);,然後再int v_INTA = 1;/換句話說,希望 INTAROOT_FUNC 內部擴展,而不是在外部擴展。我在尋找一個原則上的答案,而不是任何改變 CALLER_FUNC 產生結果的方法int v_INTA = 1;這將是微不足道的。

P.S 。如果你想知道,我最初有一個涉及信號處理( 比如 )的用例。將宏名稱作為嵌套宏的輸入,但是通過簡化我的結構來解決這些限制。

时间:原作者:0个回答

108 0

如果可以展開第一個宏以接受兩個參數,則可以將它的設置為如下所示:

#define FUNC(intname, intv) int v##intname = intv
#define CALL_FUNC(intv) FUNC(_##intv, intv)
#define INT1 1
#define INT2 2
int main(void)
{
 int INTD = 4;
 CALL_FUNC(INT1);
 CALL_FUNC(INT2);
 CALL_FUNC(INTD);
}

輸出( 來自 GCC ),看起來像這樣:

int main(void)
{
 int INTD = 4;
 int v_INT1 = 1;
 int v_INT2 = 2;
 int v_INTD = INTD;//not sure if you want the value of INTD here - I guess it doesn't matter?
}

我想你就是這麼想的如果我read你的問題?

令牌粘貼阻止預處理器擴展它並僅生成傳遞給第二個宏( 然後把它們粘在一起形成一個變數)的新令牌,值( 它被擴展) 作為第二個參數。

我覺得你應該知道上面的技巧不是你想要的。

原作者:
...