[英]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.