2011-11-21 107 views
1

考虑片段:两个相同的预处理器定义给出不同的结果

 
#define CAT(a, b) a##b 

#define M_0 CAT(x, y) 
#define M(a) CAT(M_, a)() 
M(0); 

#define N_0() CAT(x, y) 
#define N(a) CAT(N_, a)() 
N(0); 

给我M(a)N(a)两个定义看起来相同。 然而,GCC 4.6.1的cpp这个扩展为:

 
CAT(x, y)(); 
xy; 

为什么?

+1

这老栗子了。如果没有引用出处,请不要抄袭原作者。 (答案:一个宏需要参数(数字为零),另一个不是。) –

+0

@KerrekSB,坦率地说,我没有注意到其中的差异。 – ulidtko

回答

5
#define M_0 CAT(x, y) 
#define N_0() CAT(x, y) 

M_0是一个简单的文字替换。 N_0是一个宏函数,当被评估时,根据需要评估任何其他宏函数。

+0

好吧,我预计这种解决方案。谢谢。 – ulidtko

相关问题