C 语言宏定义
C 语言宏定义
1、例子如下:
#define PRINT_STR(s) printf("%s",s.c_str())
string str = "abcd";
PRINT_STR(str);
结果如下:abcd
2、现在我期望打印出,str=abcd, 容易想到的解决办法是:
#define PRINT_STR(s) printf("s" "=" "%s",s.c_str())
打印出来的结果是 s=abcd,不是我们所期望的,想一下,为什么?
在这里,编译器不认为"s"中s就是前面的s,不进行替换。如果进行替换,那么"%s" 也就换成了"%str",这显然错误。
3、怎么解决上面的问题?使用另一种方式,也就是#(字符串替换,前后加上双引号),如下:
#define PRINT_STR(s) printf(#s "=" "%s",s.c_str())
可以认为,对于#s,编译器对s进行替换,并且在s前后加上双引号
4、考虑下面的情况,
int token8 = 102;
PRINT_TOKEN(8);
期望打印出 token8,容易想到的解决办法是:
#define PRINT_TOKEN(d) printf("%d",tokend)
这样是明显错误的,编译器认为tokend是一个整体,不可能只去替换d,怎么解决?
5、怎么解决这个问题?要进行替换,必须把d隔离出来,而一旦隔离出来,替换是可以了,但是不能与token合在一起构成一个变量了。
这就要使用##(宏连接符),可以认为## 进行分割,分割后替换,替换之后,再把##去除,如下:
#define PRINT_TOKEN(d) printf("%d",token##d)
6、一个# 字符串替换,两个# 宏连接符
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人