2010-11-19 63 views
12

在下面的代碼中,##有什麼作用?宏中的雙重散列(##)是什麼意思?

#define MAKE_TYPE(myname) \ 
typedef int myname ## Id; \ 
+0

本質[SO 1489932 C預處理和串聯](http://stackoverflow.com/questions/1489932/c-preprocessor-and-concatenation/)的副本 – 2010-11-20 03:00:38

回答

22

宏中的##是串聯。在這裏,MAKE_TYPE(test)將擴展爲:typedef int testId

從16.3.3(##的操作者):

對於這兩種樣函數對象樣和 宏調用,進行復核之前 替換列表爲 多個宏名稱來替換,每個一個##在替換列表(從 參數不)預處理記號 被刪除,並且前述 預處理標記的 實例級聯 具有以下預處理記號

+4

我要強調前的*替換列表被重新檢查*。如果你寫'MAKE_TYPE(OBJECT(Foo))',那麼你將有'typedef int OBJECT(Foo)Id;'......這顯然是無效的。處理宏是複雜的,並且最好避免,尤其是對於只會混淆事物的這種微不足道的情況。 – 2010-11-19 15:22:45

4

icecrime是正確的,但是定義中要指出的一點是令牌需要是有效的預處理令牌。實例:

#define CONCAT(a,b) a ## b 
CONCAT(ClassyClass, <int>); // bad, <int> is not a valid preprocessing token 
CONCAT(Symbol, __LINE__); // valid as both are valid tokens 
+1

幾年前,這讓我感到非常沮喪,因爲我想將三件事合併在一起,而第一對和最後一對的組合都不是有效的預處理標記。 – 2010-11-19 18:04:16

+0

偉大的一點,但不是一個答案。應該是對icecrime的評論。 – 2016-07-29 15:59:47