事實上額外的參數括號這取決於你對語言標準的解釋。例如,下MCPP,即嚴格符合語言標準的文本預處理器實現中,第二產率CAT(x, y);
,以及[額外的新行已被從結果中刪除]:
C:\dev>mcpp -W0 stubby.cpp
#line 1 "C:/dev/stubby.cpp"
CAT(x, y) ;
CAT(x, y) ;
C:\dev>
有在C a known inconsistency ++語言規範(C規範中存在相同的不一致性,儘管我不知道C的缺陷列表在哪裏)。規範規定最終的CAT(x, y)
不應被宏代替。意圖可能是它應該被宏觀替代。
引述鏈接缺陷報告:
早在20世紀80年代它是由幾個WG14人,有「不更換」連篇產生僞碼的嘗試之間的微小差異的理解。
該委員會的決定是,「野外」的任何現實項目都不會冒險進入這一領域,並試圖減少不確定性並不值得改變實現或程序一致性狀態的風險。
那麼,爲什麼我們得到M(0)
比N(0)
與最常見的預處理程序實現不同的行爲?在替換的M
,的CAT
第二次調用完全由從CAT
第一次調用所得的令牌:
M(0)
CAT(M_, 0)
CAT_I(M_, 0)
M_0
CAT(x, y)
如果M_0
代替定義爲由CAT(M, 0)
更換,更換會無限遞歸。預處理器規範通過停止宏替換來明確禁止「嚴格遞歸」替換,因此CAT(x, y)
未被宏替換。
然而,在替換的N
,的CAT
第二次調用由僅部分地從CAT
第一次調用所得令牌:
N(0)
CAT(N_, 0) ()
CAT_I(N_, 0) ()
N_0 ()
CAT(x, y)
CAT_I(x, y)
xy
這裏CAT
第二次調用的一部分從令牌形成從第一次調用CAT
開始,部分來自其他標記,即來自N
替換列表中的()
。替換不是嚴格遞歸的,因此當第二次調用CAT
被替換時,它不能產生無限遞歸。
呃......你到底想要在這裏完成什麼......爲了什麼目的? – t0mm13b 2011-04-12 21:30:17
我真的不想做任何事情,只是在處理某些事情時注意到了這一點,而且我很好奇原因。當我不明白某事時,它會讓我很難過:)。 – imre 2011-04-12 21:41:32