[英]Macro expansion in C
這個宏
#define f(x) x x
f (1
#undef f
#define f 2
f)
根據此鏈接擴展到此1 2 1 2
。
它實際上是這樣做的,我已經使用Xcode Product > Perform Action > Preprocess
驗證了但是在擴展此宏時預處理器遵循了哪些步驟?
初步情況:
f (1
#undef f
#define f 2
f)
如果我們引用您提供的鏈接,則會通過兩個步驟對宏進行預處理:
第1步:論證預擴展
如果在宏調用中重新定義了該宏,則新定義將在參數預擴展時及時生效
的替換f
,由2用作參數傳遞給函數宏,:
f(1 f) -> f (1 2)
第2步:參數替換
但原始定義仍用於替換參數
使用其原始定義解析類似函數的宏f
:
f(1 2) -> 1 2 1 2
整件事實際上等同於以下內容:
#define f(x) x x
#define g 2
f(1 g)
我認為發生的事情如下,為了能夠更好地可視化步驟,讓我們通過添加可區分的括號來重寫#define
語句。
#define f(x) (x) [x]
f (1
#undef f
#define f 2
f)
//注意,這不會產生有效的C代碼。 我正在玩它以了解預處理所采取的操作,而不是編譯它。 通過產品>操作>預處理查看預處理器的結果,如上所示。
因此,預處理器采取的第一步是替換,x被語句中提供的值替換(本例中為“1”),宏值中有2倍x,因此相同的替換發生兩次。 這里的()和[]括號有助於區分兩條路徑:
(1
#undef f
#define f 2
f) [1
#undef f
#define f 2
f]
然后#undef
宏f
,它確實存在並重新定義為f 2
(1 f) [1 f]
在最后一步中,使用當前攜帶的值進行簡單的f
替換,在這種情況下為2
(1 2) [1 2]
而已。 預期結果1 2 1 2
已被替換為地面。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.