[英]C preprocessor macro expansion
我很難理解在以下上下文中 C 預處理器如何應用重寫規則。 我有以下宏:
#define _A(x) "A" _##x
#define _B(x) "B" _##x
#define X(x) _##x
這個想法是這些宏中的每一個都使用連接來創建一個新的表達式,它本身可以是一個宏——如果它是一個宏,我希望它被擴展:
現在,以下擴展就像我期望的那樣:
X(x) expands to _x
X(A(x)) expands to "A" _x
X(A(B(x))) expands to "A" "B" _x
但是,一旦同一個宏被多次使用,擴展就會停止:
X(A(A(x))) expands to "A" _A(x), expected "A" "A" _x
X(B(B(x))) expands to "B" _B(x), expected "B" "B" _x
X(A(B(A(x)))) expands to "A" "B" _A(x), expected "A" "B" "A" _x
X(A(B(A(B(x))))) expands to "A" "B" _A(B(x)), expected "A" "B" "A" "B" _x
我猜這里有某種“只能擴展同名宏一次”的規則嗎? 我可以做些什么來讓宏以我想要的方式擴展?
C99草案說宏擴展中不允許遞歸:
6.10.3.4重新掃描和進一步更換
- 在替換列表中的所有參數都已被替換並且已經進行
#
和##
處理之后,將刪除所有地標標記預處理標記。 然后重新掃描生成的預處理標記序列以及源文件的所有后續預處理標記,以替換更多的宏名稱。- 如果在替換列表的掃描期間找到要替換的宏的名稱 (不包括源文件的其余預處理標記), 則不會替換它 。 此外,如果任何嵌套替換遇到要替換的宏的名稱,則不會替換它。 這些未替換的宏名稱預處理令牌不再可用於進一步替換,即使它們稍后(重新)檢查在其中否則將替換該宏名稱預處理令牌的上下文中。
所以X(A(A(x)))
擴展為"A" _A(x)
,但正如您所見,該擴展本身並未擴展。
我有一個解決方案,給我發電子郵件 patrikfrnka@seznam.cz
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.