回答
宏中的##
是串聯。在這裏,MAKE_TYPE(test)
將擴展爲:typedef int testId
。
從16.3.3(##的操作者):
對於這兩種樣函數對象樣和 宏調用,進行復核之前 替換列表爲 多個宏名稱來替換,每個一個##在替換列表(從 參數不)預處理記號 被刪除,並且前述 預處理標記的 實例級聯 具有以下預處理記號
我要強調前的*替換列表被重新檢查*。如果你寫'MAKE_TYPE(OBJECT(Foo))',那麼你將有'typedef int OBJECT(Foo)Id;'......這顯然是無效的。處理宏是複雜的,並且最好避免,尤其是對於只會混淆事物的這種微不足道的情況。 – 2010-11-19 15:22:45
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
幾年前,這讓我感到非常沮喪,因爲我想將三件事合併在一起,而第一對和最後一對的組合都不是有效的預處理標記。 – 2010-11-19 18:04:16
偉大的一點,但不是一個答案。應該是對icecrime的評論。 – 2016-07-29 15:59:47
- 1. 「散貨」是什麼意思?
- 2. '散列缺點'是什麼意思?
- 3. Bash'type someCmd':什麼意思是'散列'?
- 4. 什麼是雙重?在C#中是什麼意思?
- 5. c。宏中的`.`和`*`是什麼意思?
- 6. C宏中的#x是什麼意思?
- 7. 宏中的__VA_ARGS__是什麼意思?
- 8. 這是什麼意思#value在宏中
- 9. 是什麼意思:是什麼意思?
- 10. 散列中的聚集(在碰撞中)是什麼意思?
- 11. 重點是什麼意思?
- 12. 「重構」是什麼意思?
- 13. 這個C宏是什麼意思?
- 14. 這個宏函數是什麼意思?
- 15. 宏_bnd(X,bnd)是什麼意思?
- 16. 這個C宏是什麼意思?
- 17. JavaScript中的雙重百分比符號(%%)是什麼意思?
- 18. 雙腿認證是什麼意思?
- 19. 雙括號是什麼意思?
- 20. WinDbg中的「重疊」是什麼意思?
- 21. 散列time_t的字節是什麼意思?
- 22. 「散列函數的分佈」是什麼意思?
- 23. 什麼是 「範圍(」 F:F 「)」 在Excel宏是什麼意思?
- 24. 是什麼意思,在Python中是什麼意思?
- 25. .js文件後散列(#)是什麼意思?
- 26. 什麼意思是「x位散列函數」
- 27. 散列函數增量是什麼意思?
- 28. Ruby on Rails這個散列輸出是什麼意思?
- 29. 雙重不存在子句是什麼意思?
- 30. SURF的min_dist和max_dist是什麼意思,FlannMatcher是什麼意思
本質[SO 1489932 C預處理和串聯](http://stackoverflow.com/questions/1489932/c-preprocessor-and-concatenation/)的副本 – 2010-11-20 03:00:38