预处理器运算符

# 运算符或字符串化运算符用于将 Macro 参数转换为字符串文字。它只能与带参数的宏一起使用。

// preprocessor will convert the parameter x to the string literal x
#define PRINT(x) printf(#x "\n")

PRINT(This line will be converted to string by preprocessor);
// Compiler sees
printf("This line will be converted to string by preprocessor""\n");

编译器连接两个字符串,最后的 printf() 参数将是一个字符串文字,其末尾带有换行符。

预处理器将忽略宏参数之前或之后的空格。所以下面的 print 语句会给我们相同的结果。

PRINT(   This line will be converted to string by preprocessor );

如果字符串文字的参数需要像双引号()之前的转义序列,它将由预处理器自动插入。

PRINT(This "line" will be converted to "string" by preprocessor); 
// Compiler sees
printf("This \"line\" will be converted to \"string\" by preprocessor""\n");

## 运算符或令牌粘贴运算符用于连接宏的两个参数或标记。

// preprocessor will combine the variable and the x
#define PRINT(x) printf("variable" #x " = %d", variable##x)

int variableY = 15;
PRINT(Y);
//compiler sees
printf("variable""Y"" = %d", variableY);

最终的输出将是

variableY = 15