事实上额外的参数括号这取决于你对语言标准的解释。例如,下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