c++ - 复杂情况下如何进行宏替换?

标签 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 标准,在我看来,代码应该对具有 L"xa" 值的 w 有效。

  1. 找到 A 的调用,对其进行处理会产生 pp 序列 T ( "x"T ( "a") )
  2. 找到 T 的调用,产生 L ## "x"T ( "a"),这又产生 L"x"T ( "a").
  3. 找到 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/

相关文章:

objective-c - iPhone项目常数

c++ - 这里有人可以提供 PCM 音频数据的高通滤波器样本吗?

c++ - 在构造函数中动态分配新对象

c - C 的内存分析器

c - 一个程序改变另一个程序的数据

比较十六进制值中的 n 个字符序列

c++ - 什么是消除涉及默认/删除移动/复制语义的样板的好方法?

c++ - 如何使用 RHS 上的引用指针重载 operator<<?

c# - 我如何在 C# 中将 void 指针转换为结构

c++ - visual studio 2010-c++ 项目中的预处理器