考虑以下示例代码。
#define T(q) L##q
#define A(p) T("x" T(#p))
wchar_t w[] = A(a);
这段代码格式是否正确? w
的值是多少? C 和 C++ 中的行为是否不同?在 C++0x 中有什么不同吗?
我浏览了 C++03 标准,在我看来,代码应该对具有 L"xa"
值的 w
有效。
- 找到
A
的调用,对其进行处理会产生 pp 序列T ( "x"T ( "a") )
。 - 找到
T
的调用,产生L ## "x"T ( "a")
,这又产生L"x"T ( "a")
. - 找到
T
的调用,产生L"x"L"a"
。
这样对吗? EDG 和 Clang 都不接受该片段,MSVC 9 编译它就好了。
最佳答案
g++ 扩展为
L"x" T("a")
宏不能递归,它们只在一次拍摄中进行预处理,所以 T(#p)
不会再次展开。如果您想要 L"xa"
则可以执行以下操作:
#define A(p) T("x")#p
#define T(q) L##q
(实际上是 L"x""a"
。)
关于c++ - 复杂情况下如何进行宏替换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6627086/