簡體   English   中英

無與倫比的支架宏怪異

[英]Unmatched bracket macro weirdness

在C99規則下預處理以下3行的正確輸出是什么?

#define y(x) x
#define x(a) y(a
x(1) x(2)))

Linux下的BTW cpp產​​生錯誤信息,但我不明白為什么答案不簡單

1 2

假設cpp是正確的,我錯了,我會非常感謝你的解釋。

當找到宏時,預處理器收集宏的參數,然后隔離掃描每個宏參數,以便在擴展第一個宏之前在參數內展開其他宏:

6.10.3.1參數替換

在確定了調用類函數宏的參數之后,發生了參數替換。 替換列表中的參數除非前面帶有#或##預處理標記或后跟##預處理標記(見下文),否則在擴展其中包含的所有宏之后,相應的參數將替換該參數。 在被替換之前,每個參數的預處理標記都被完全宏替換,好像它們形成了預處理文件的其余部分; 沒有其他預處理令牌可用。

所以在這個具體的例子中,它看到了x(1)並擴展了它,給出了

y(1 x(2)))

然后它標識宏調用y(1 x(2)) ,參數1 x(2)和prescans宏以擴展。 在其中,它找到x(2) ,它擴展為y(2然后由於沒有a而觸發錯誤)對於y宏。 請注意,此時它仍然希望擴展第一個y宏的參數,因此它會孤立地查看它而不考慮輸入文件的其余部分,這與6.10.3.4的擴展不同

現在有一些問題是,這實際上是否應該是一個錯誤,或者預處理器是否應該處理這個y(2序列根本不是一個宏調用,因為沒有')'。 如果它執行后者,那么它會將y調用擴展為1 y(2然后將與輸入( )的其余部分組合)並最終擴展為1 2

擴展宏之后,在結果文本與周圍文本組合之前,嘗試在生成的文本中展開宏。 因此,擴展y(1的嘗試y(1給出了這個錯誤。實際上很難指定宏擴展以你想要的方式工作,同時仍然滿足許多其他所需的行為(例如缺乏無限遞歸)。

暫無
暫無

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

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