前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【C语言笔记】#运算符与##运算符

【C语言笔记】#运算符与##运算符

作者头像
正念君
发布2019-07-01 17:25:44
1.9K0
发布2019-07-01 17:25:44
举报
文章被收录于专栏:嵌入式大杂烩嵌入式大杂烩

1、#运算符

我们平时使用带参宏时,字符串中的宏参数是没有被替换的。例如:

VbbRo9.md.png
VbbRo9.md.png

输出结果为:

VbbqdH.md.png
VbbqdH.md.png

然而,我们期望输出的结果是:

代码语言:javascript
复制
5 + 20 = 25
13 + 14 = 27

这该怎么做呢?其实,C语言允许在字符串中包含宏参数。在类函数宏(带参宏)中,#号作为一个预处理运算符,可以把记号转换成字符串。例如,如果A是一个宏形参,那么#A就是转换为字符串”A”的形参名。这个过程称为字符串化(stringizing)。以下程序演示这个过程:

Vbq9OS.md.png
Vbq9OS.md.png

输出结果为:

VbqiwQ.md.png
VbqiwQ.md.png

这就达到我们想要的结果了。所以,#运算符可以完成字符串化(stringizing)的过程。

2、##运算符

与#运算符类似,##运算符可用于类函数宏(带参宏)的替换部分。##运算符可以把两个记号组合成一个记号。例如,可以这样做:

代码语言:javascript
复制
#define XNAME(n) x##n

然后,宏XNAME(4)将展开x4。以下程序演示##运算符的用法:

VbqEYn.md.png
VbqEYn.md.png

输出结果为:

VbqdmD.md.png
VbqdmD.md.png

注意:PRINT_XN()宏用#运算符组合字符串,##运算符把记号组合为一个新的标识符。

其实,##运算符在这里看来并没有起到多大的便利,反而会让我们感觉到不习惯。但是,使用##运算符有时候是可以提高封装性及程序的可读性的。如跑实时操作系统的stm32程序中,关于gpio的硬件驱动中有如下代码:

代码语言:javascript
复制
#define __STM32_PIN(index, gpio, gpio_index) \
{ \
index, GPIO##gpio##_CLK_ENABLE, GPIO##gpio, GPIO_PIN_##gpio_index \
}

假设这样使用该宏:

代码语言:javascript
复制
__STM32_PIN(7, C, 13)

该宏将展开为:

代码语言:javascript
复制
{7, GPIOC_CLK_ENABLE, GPIOC, GPIO_PIN_13}

然后这就可以很方便的将要使用的硬件引脚这么一一列出来,然后再拿去进行配置:

ZC60ij.md.png
ZC60ij.md.png

以上就是关于#运算符与##运算符的笔记,用#运算符组合字符串,##运算符把记号组合为一个新的标识符。如有错误欢迎指出。资料:『RT-Thread-IoT代码』、『C Primer Plus』。


本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-05-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、#运算符
  • 2、##运算符
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档