2016-07-23 25 views
4

在下面的宏定義,也就是2個間接的實際粘貼操作之前:爲什麼2個間接的宏定義##操作

#define MACRO_JOIN(a, b) MACRO_JOIN1(a, b) 
#define MACRO_JOIN1(a, b) MACRO_JOIN2(a, b) 
#define MACRO_JOIN2(a, b) a##b 

我知道,我們需要MACRO_JOIN1因爲它有沒有粘貼或串列化,以便可以首先擴展它的參數。

但究竟是第二個間接MACRO_JOIN的目的是什麼? MACRO_JOIN會在什麼情況下工作,但MACRO_JOIN1會失敗?

回答

6

強制進行額外的擴展可能會在初始擴展導致進一步擴展的地方產生影響。一個小示例,給出:

#define MACRO(x) x 
#define EXPAND(x) x 
#define NOEXPAND() 

是:

MACRO NOEXPAND() (123) 

這擴大到MACRO (123)。在另一方面,如果你強迫一個額外的擴展,像這樣:

EXPAND(MACRO NOEXPAND() (123)) 

結果:

123 

通常情況下,迫使更多的擴展像這是不必要的:任何宏定義會導致這種情況無論如何,任何區別通常被認爲是差的風格。但是對於某些具體的投入,它可能是有用的。

因此,對於一個具體的例子與MACRO_JOIN

MACRO_JOIN(123, MACRO NOEXPAND() (456)) // expands to 123456 
MACRO_JOIN1(123, MACRO NOEXPAND() (456)) // expands to 123MACRO (456) 
+0

驚人的解釋!我必須在我的cpp實現上嘗試這些特殊的測試用例... – chqrlie

+0

我明白了。我認爲它的目的就像是「強迫」某些東西,但我從未想過這種用途。另一個問題:在你的例子中,宏NOEXPAND()幾乎是無用的。有什麼情況可以使用它嗎? –

+0

@ PJ.Hades就像我說過的那樣,任何宏觀定義在哪裏都有所影響,無論如何都被認爲是糟糕的風格。任何我能想到的例子都和'NOEXPAND()'一樣無用。所以我會說不要擔心它,除非你碰巧用你正在使用的宏定義找到它的用例。 – hvd

相關問題