在 C 语言宏定义中,# 运算符的作用就是字符串化(stringification),即:把宏参数转换成字符串常量。
一、基本语法
#define 宏名(x) #x
其中:
#x
会把传入的参数 x
转换成 "x" 这样的字符串。
二、简单示例
#include <stdio.h>
#define STR(x) #x
int main()
{
printf("%s\n", STR(hello));
return 0;
}
预处理后:
printf("%s\n", "hello");输出:
hello
三、表达式整体变成字符串
printf("%s\n", STR(a + b));展开后:
printf("%s\n", "a + b");输出:
a + b
注意:
这里不会计算表达式,
只是把“文本”变成字符串。
四、典型用途1)调试打印
这是最常见用途。
#define PRINT(x) printf(#x " = %d\n", x)
int a = 10;
PRINT(a);
展开:
printf("a" " = %d\n", a);字符串自动拼接后:
printf("a = %d\n", a);输出:
a = 10
2)打印表达式
#define PRINT_EXPR(x) \
printf(#x " = %d\n", (x))
PRINT_EXPR(a + 5);
输出:
a + 5 = 15
常见于日志系统中。
五、字符串化不会展开宏
这是一个非常重要的知识点。
例如:
#define NUM 100
#define STR(x) #x
printf("%s\n", STR(NUM));
结果是:
"NUM"
而不是:
"100"
因为:
# 会阻止参数进一步宏展开。
六、先展开再字符串化
需要“两层宏”。
经典写法:
#define STR(x) #x
#define XSTR(x) STR(x)
#define NUM 100
printf("%s\n", XSTR(NUM));
过程:
第一层:
XSTR(NUM)
→ STR(100)
第二层:
STR(100)
→ "100"
输出:
100
我要赚赏金
