如何在复杂情况下执行宏替换?

时间:2011-07-08 15:55:00

标签: c++ c c-preprocessor

请考虑以下示例代码。

#define T(q) L##q
#define A(p) T("x" T(#p))
wchar_t w[] = A(a);

这段代码是否格式正确? w的价值是多少? C 和C ++中的行为是否不同?它在C ++ 0x中是不同的吗?

我已经浏览了C ++ 03标准,在我看来,代码应该在w具有值L"xa"的情况下有效。

  1. 找到A的调用,其处理产生pp序列T ( "x" T ( "a" ) )
  2. 找到T的调用,产生L ## "x" T ( "a" ),然后产生L"x" T ( "a" )
  3. 找到T的调用,产生L"x" L"a"
  4. 这是对的吗? EDG和Clang都没有接受该片段,MSVC 9编译得很好。

1 个答案:

答案 0 :(得分:4)

g ++扩展到

L"x" T("a")

宏不能递归,只能一次预处理,因此T(#p)不会再次展开。如果您想要L"xa",那么可以完成以下操作:

#define A(p) T("x")#p
#define T(q) L##q

(实际上是L"x""a"。)