问我有一些旧代码,试图使用一个宏来构造标识符,例如
#define Paste(a, b) a/**/b这样的宏来构造标识符,但它不再起作用了。
答早期预处理器实现(尤其是 Reiser 的)中有一个未文档化的功能,即注释会完全消失,因此可以用于标记粘贴。ANSI 规定(K&R1 也是如此)注释会被替换为空白字符,所以它们不能在 aPaste()宏中移植使用。然而,由于标记粘贴的需求已被证明且是真实的,ANSI 引入了一个明确定义的标记粘贴运算符,##,可以这样使用
#define Paste(a, b) a##b
在 ANSI 之前的编译器中,你还可以尝试用以下方法来粘贴标记
#define XPaste(s) s #define Paste(a, b) XPaste(a)b另请参阅问题 11.17。
参考文献:ISO Sec. 6.8.3.3
Rationale Sec. 3.8.3.3
H&S Sec. 3.3.9 p. 52