簡體   English   中英

C中的宏擴展

[英]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語句。

第0步

#define f(x) (x) [x]

f (1
#undef f
#define f 2
f)

//注意,這不會產生有效的C代碼。 我正在玩它以了解預處理所采取的操作,而不是編譯它。 通過產品>操作>預處理查看預處理器的結果,如上所示。

因此,預處理器采取的第一步是替換,x被語句中提供的值替換(本例中為“1”),宏值中有2倍x,因此相同的替換發生兩次。 這里的()和[]括號有助於區分兩條路徑:

步驟1

(1
#undef f
#define f 2
f) [1
    #undef f
    #define f 2
    f]

然后#undeff ,它確實存在並重新定義為f 2

第2步

(1 f) [1 f]

在最后一步中,使用當前攜帶的值進行簡單的f替換,在這種情況下為2

第3步

(1 2) [1 2]

而已。 預期結果1 2 1 2已被替換為地面。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM