2015-05-11 81 views
1

我閱讀了一些示例代碼,並且瞭解了我以前從未見過的這種##語法。該代碼示例如下:什麼是##語法?

#define DEF_MAKE_BT_1_COMP(BT)\ 
inline i_##BT make_i_##BT(i_##BT::vtype x) { return make_##BT(x); } 

#define DEF_MAKE_BT2(T)   \ 
DEF_MAKE_BT_1_COMP(T##1);   \ 
DEF_MAKE_BT_2_COMP(T##2); 

DEF_MAKE_BT2(double); 

當我在最後一行是遇到錯誤「make_double1」是不確定的。有沒有人見過這種語法?

+3

令牌串聯。在SO上被問及幾次回答。與以往一樣,困難將會找到正確的問題,使之成爲重複的。 –

+0

詞法連接。 https://gcc.gnu.org/onlinedocs/cpp/Concatenation.html –

+0

請參閱[C預處理器和令牌串聯](http://stackoverflow.com/questions/1489932/)。 –

回答

3

##是連接兩個令牌的預處理器運算符。

http://en.cppreference.com/w/cpp/preprocessor/replace

甲##在替換-列表中的任何兩個連續的標識符之間操作運行在兩個標識符(其不是宏觀膨脹的第一)參數替換,然後串接結果。這個操作被稱爲「連接」或「令牌粘貼」。只有形成有效令牌的令牌可以粘貼:形成較長標識符的標識符,形成數字的數字或形成+ =的運算符+和=。評論不能通過粘貼/和*來創建,因爲在考慮宏替換之前從文本中刪除了註釋。如果連接的結果不是有效的標記,則行爲是未定義的。