C语言 | 两个冷门但有用的C运算符

1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。关注微信公众号【嵌入式大杂烩】,回复1024,即可免费获取!

接上篇笔记我们分享的是RTT的PIN设备驱动:【RT-Thread笔记】IO设备模型及PIN设备,其中用到PIN驱动框架中的pin_mode函数来设置引脚的模式:

void rt_pin_mode(rt_base_t pin,rt_base_t mode);

这里的引脚编号pin需要和芯片的引脚号区分开来,它们并不是同一个概念,引脚编号由PIN设备驱动程序定义,和具体的芯片相关。其实,驱动代码drv_gpio.c文件一个结构体数组存放了每个PIN脚对应的编号信息,如:

可以看到,__STM32_PIN是一个带参宏,其用到##符号是个什么东东?再看一下PIN结构体的定义如下:

/* STM32 GPIO driver */
struct pin_index
{
    int index;
    void (*rcc)(void);
    GPIO_TypeDef *gpio;
    uint32_t pin;
};

所以__STM32_PIN中:

index:代表引脚编号
GPIO##gpio##_CLK_ENABLE:代表时钟使能
GPIO##gpio:代表端口
GPIO_PIN_##gpio_index:代表引脚号

可以推出##符号起连接作用。假设这样使用该宏:

__STM32_PIN(7, C, 13)

该宏将展开为:

{7, GPIOC_CLK_ENABLE, GPIOC, GPIO_PIN_13}

同时,常常与##符号一起用的还有#符号。下面看看这两个你可能没用过,但却很有用的符号(运算符):

1、#运算符

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

输出结果为:

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

5 + 20 = 25
13 + 14 = 27

这该怎么做呢?其实,C语言允许在字符串中包含宏参数。在类函数宏(带参宏)中,#号作为一个预处理运算符,可以把记号转换成字符串。

例如,如果A是一个宏形参,那么#A就是转换为字符串"A"的形参名。这个过程称为字符串化(stringizing)。以下程序演示这个过程:

输出结果为:

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

2、##运算符

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

#define XNAME(n) x##n

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

输出结果为:

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

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

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

有些东西我们用得太少了,所以可能会误以为没有用,但实际上却是很有用的,我们应当要多积累各个知识点。

以上就是本次的分享,希望可以对大家有帮助!欢迎收藏、转发、在看~

猜你喜欢:

为什么Linux内核里大量使用goto,而很多书籍却不提倡使用?

sizeof你真的弄明白了吗?来看看这个例子

a是一个数组,那么&a是什么?&a+1的值又是什么?

STM32F429的USB是个坑?

1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。关注微信公众号【嵌入式大杂烩】,回复1024,即可免费获取!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式大杂烩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值