c语言字符串替换_C语言笔记:运算符与运算符

c6ea494cca05463a9f289986d7e6dd0f.png

1、#运算符

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

de2b9dce5efa747fbbd5d9c6bbc0b72e.png

输出结果为:

ad04402c817150efcc0ae19da9f5c341.png

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

5 + 20 = 25
13 + 14 = 27

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

03c163822ef60bfa9fdc2dee17865f67.png

输出结果为:

523311b54ab5b0325d91b125cf22be65.png

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

2、##运算符

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

#define XNAME(n) x##n

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

5b89c72469a4501fc8f96f3ef400fb3e.png

输出结果为:

91ab789b9d364067c01a313d911a0587.png

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

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

#define __STM32_PIN(index, gpio, gpio_index) 
{ 
index, GPIO##gpio##_CLK_ENABLE, GPIO##gpio, GPIO_PIN_##gpio_index 
}

假设这样使用该宏:

__STM32_PIN(7, C, 13)

该宏将展开为:

{7, GPIOC_CLK_ENABLE, GPIOC, GPIO_PIN_13}

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

353c002cd38a17855c31a596ba8242f2.png

以上就是关于#运算符与##运算符的笔记,用#运算符组合字符串,##运算符把记号组合为一个新的标识符。如有错误欢迎指出。

很多初学者,对C语言、c++的概念都是模糊不清的,C语言、c++是什么,能做什么,学的时候,该按照什么线路去学习,学完往哪方面发展,想深入了解,详情可以点击有道云笔记链接了解:

有道云笔记​note.youdao.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值