2017-02-04 58 views
2

這行:串聯預處理:

#define hash_hash # ## # 

會產生##而是基於不是未定義行爲:

如果結果不是一個有效的預處理標記,該行爲是未定義 。

編輯:

換句話說,擴大hash_hash產生新令牌,由兩個相鄰的尖銳的跡象, 但這新令牌不是## 操作者

預處理標記的類別爲:

預處理標記分​​爲五大類:標識符, 預處理數字,字符串文字,標點符號和其他

##新的令牌屬於其他類別如果沒有UB

請注意:請花些時間閱讀與之相關的問題和答案,甚至在下載之前。

+4

您認爲未定義的行爲意味着什麼?這意味着它可以做任何事情。 –

回答

7

這是標準的一個例子。 ##有效的預處理令牌。正如那裏使用的那樣,它是形成連接運算符的令牌。它在C語法中根本沒有意義(預處理後)。但它出現在標點符號列表中,如*++

由於沒有語法規則會匹配它,所以不可避免的結果是將被診斷的語法錯誤。 除非,它被傳遞給另一個宏,它將其字符串化或忽略它。

#define IGNORE(X) 
#define STRINGIZE_LIT(X) #X 
#define STRINGIZE(X) STRINGIZE_LIT(X) 

IGNORE(hash_hash) // OK, token is not passed to semantic analysis. 
printf(STRINGIZE(hash_hash)); // OK, same as printf("##"); 
+2

你沒有回答我的問題,我知道它是在那裏使用的串聯。 – Sabrina

+1

@Sabrina你已經編輯了這個問題,但答案保持不變。是的,令牌處於「其他」類別。 – Potatoswatter