操作符

# 操作符

当在宏定义中使用 # 运算符时,宏的参数会被转换成字符串字面量。

  • #操作符用于在预处理期将宏参数转换为字符串
  • #的转换作用是在预处理期完成的,因此只在宏定义中生效
  • 编译器不知道 # 的转换作用(# 是预处理器所使用的一个特殊的运算符,编译器是不认识 # 运算符的)

用法

1
2
3
#define STRING(x) #x // 这里 #x 中的 #,会将 x 变成一个字符串

printf("%s\n", STRING(Hello World!)); // Hello World!

使用 gcc -E demo.c -o demo.i 生成中间代码:

caozuofu

此处我们可以发现宏已经不在了,已经被我们的预处理器替换掉了

## 操作符

  • ##运算符用于在预处理期粘连两个标识符
  • ##的连接作用是在预处理期完成的,因此只有在宏定义中有效
  • 编译器不知道 ## 的连接作用

用法

1
2
3
#define CONNECT(a, b) a##b
int CONNECT(a, 1); int a1;
al = 2;