请考虑以下示例代码。
#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"
的情况下有效。
A
的调用,其处理产生pp序列T ( "x" T ( "a" ) )
。T
的调用,产生L ## "x" T ( "a" )
,然后产生L"x" T ( "a" )
。T
的调用,产生L"x" L"a"
。这是对的吗? EDG和Clang都没有接受该片段,MSVC 9编译得很好。
答案 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"
。)