C语言宏定义:#与##的用法解析
5星 · 超过95%的资源 需积分: 0 137 浏览量
更新于2024-09-13
收藏 39KB DOC 举报
"C语言宏定义中#用法"
在C语言中,宏定义是一种预处理器功能,用于在编译期间替换文本。`#`和`##`是宏定义中的特殊操作符,它们提供了两种独特的用法。
一、`#`用法
`#`操作符的作用是将宏参数转换为字符串字面量。当宏被调用时,如果参数前有`#`,编译器会将该参数替换为对应的字符串常量。例如:
```c
#define STR(s) #s
printf(STR(vck)); // 输出字符串 "vck"
```
在这个例子中,`STR(vck)`会被替换为`"vck"`,然后传递给`printf`函数,最终输出字符串"vck"。
二、`##`用法
`##`操作符用于拼接(concatenation)两个宏参数。它会将相邻的两个参数连接成一个新标识符。例如:
```c
#define CONS(a, b) int(a##e##b)
printf("%d\n", CONS(2, 3)); // 输出 2000
```
在这个例子中,`CONS(2, 3)`会被展开为`int(2e3)`,因为`##`操作符将`2`、`e`和`3`连接在一起,形成了整数2000。
三、宏参数与`#`、`##`的交互
1. 当宏参数是另一个宏时,`#`和`##`会阻止进一步的宏展开。例如:
```c
#define TOW 2
printf("%d*%d=%d\n", TOW, TOW, MUL(TOW, TOW));
```
在`MUL(TOW, TOW)`中,`TOW`不会被再次展开,所以`MUL`的参数是`(2)`,而不是`4`。
2. 当`#`或`##`与宏参数相邻时,宏参数不会被展开。例如:
```c
#define A 2
printf("intmax:%s\n", STR(INT_MAX));
printf("%s\n", CONS(A, A));
```
`INT_MAX`在`STR`中不会被展开,因此`STR(INT_MAX)`的结果是`"INT_MAX"`。而`CONS(A, A)`会导致编译错误,因为`A`没有被展开,尝试拼接`AeA`不是一个有效的标识符。
解决这个问题的一种方法是添加一层中间转换宏,以确保所有宏参数在使用`#`或`##`之前完全展开。例如:
```c
#define _STR(s) #s
#define STR(s) _STR(s)
#define _CONS(a, b) int(a##e##b)
#define CONS(a, b) _CONS(a, b)
```
这样,`STR(INT_MAX)`会先通过 `_STR` 展开`INT_MAX`,然后再转换为字符串,而`CONS(A, A)`也会正确地进行拼接。
总结,`#`和`##`在C语言的宏定义中提供了字符串化和拼接的功能,但它们在处理宏参数时有特定的行为规则,需要谨慎使用以避免预处理器错误或意外的结果。理解和利用这些规则可以帮助编写更高效、更灵活的代码。
2014-12-09 上传
2020-07-21 上传
点击了解资源详情
点击了解资源详情
2013-09-17 上传
点击了解资源详情
点击了解资源详情
2020-07-29 上传
2021-09-14 上传
leaker
- 粉丝: 12
- 资源: 36
最新资源
- 基于Python和Opencv的车牌识别系统实现
- 我的代码小部件库:统计、MySQL操作与树结构功能
- React初学者入门指南:快速构建并部署你的第一个应用
- Oddish:夜潜CSGO皮肤,智能爬虫技术解析
- 利用REST HaProxy实现haproxy.cfg配置的HTTP接口化
- LeetCode用例构造实践:CMake和GoogleTest的应用
- 快速搭建vulhub靶场:简化docker-compose与vulhub-master下载
- 天秤座术语表:glossariolibras项目安装与使用指南
- 从Vercel到Firebase的全栈Amazon克隆项目指南
- ANU PK大楼Studio 1的3D声效和Ambisonic技术体验
- C#实现的鼠标事件功能演示
- 掌握DP-10:LeetCode超级掉蛋与爆破气球
- C与SDL开发的游戏如何编译至WebAssembly平台
- CastorDOC开源应用程序:文档管理功能与Alfresco集成
- LeetCode用例构造与计算机科学基础:数据结构与设计模式
- 通过travis-nightly-builder实现自动化API与Rake任务构建