标记粘贴运算符 (##)
双数字符号或标记粘贴运算符 (##)(有时称为“合并”运算符)可在类似对象和类似函数的宏中使用。 它允许将不同的标记加入到单个标记中,因此不能是宏定义中的第一个或最后一个标记。
如果宏定义中的形参的前面或后面带有 token-pasting 运算符,则会立即将形参替换为未扩展的实参。 在替换前将不会对自变量执行宏扩展。
之后,将移除标记字符串中出现的每个标记粘贴运算符,并将其前后的标记连接在一起。 生成的标记必须是有效的标记。 如果标记有效,则在它表示宏名称时扫描其中可能的替换。 标识符表示连接在一起的标记在替换前在程序中已知的名称。 每个标记表示在别处(在程序中或在编译器命令行上)定义的标记。 运算符前后的空白是可选的。
此示例演示了在指定程序输出时对 stringizing 和 token-pasting 运算符的使用:
#define paster( n ) printf_s( "token" #n " = %d", token##n )
int token9 = 9;
如果使用类似如下的数值自变量调用一个宏
paster( 9 );
宏将生成
printf_s( "token" "9" " = %d", token9 );
它将变为
printf_s( "token9 = %d", token9 );
示例
// preprocessor_token_pasting.cpp
#include <stdio.h>
#define paster( n ) printf_s( "token" #n " = %d", token##n )
int token9 = 9;
int main()
{
paster(9);
}
token9 = 9