C语言笔记运算符与运算符
接上篇笔记我们分享的是RTT的PIN设备驱动:RTThread笔记IO设备模型及PIN设备,其中用到PIN驱动框架中的pinmode函数来设置引脚的模式:voidrtpinmode(rtbasetpin,rtbasetmode);
这里的引脚编号pin需要和芯片的引脚号区分开来,它们并不是同一个概念,引脚编号由PIN设备驱动程序定义,和具体的芯片相关。其实,驱动代码drvgpio。c文件一个结构体数组存放了每个PIN脚对应的编号信息,如:
可以看到,STM32PIN是一个带参宏,其用到符号是个什么东东?再看一下PIN结构体的定义如下:STM32GPIOdriverstructpinindex{intindex;void(rcc)(void);GPIOTypeDefgpio;uint32tpin;};
其中,STM32PIN中的内容为:index:代表引脚编号GPIOgpioCLKENABLE:代表时钟使能GPIOgpio:代表端口GPIOPINgpioindex:代表引脚号
从这里可以推出符号起连接作用。假设这样使用该宏:STM32PIN(7,C,13)
该宏将展开为:{7,GPIOCCLKENABLE,GPIOC,GPIOPIN13}
同时,常常与符号一起用的还有符号。下面看看这两个你可能没用过,但却很有用的符号(运算符):
1、运算符
我们平时使用带参宏时,字符串中的宏参数是没有被替换的。例如:
输出结果为:
然而,我们期望输出的结果是:52025131427
这该怎么做呢?其实,C语言允许在字符串中包含宏参数。在类函数宏(带参宏)中,号作为一个预处理运算符,可以把记号转换成字符串。例如,如果A是一个宏形参,那么A就是转换为字符串A的形参名。这个过程称为字符串化(stringizing)。以下程序演示这个过程:
输出结果为:
这就达到我们想要的结果了。所以,运算符可以完成字符串化(stringizing)的过程。2、运算符
与运算符类似,运算符可用于类函数宏(带参宏)的替换部分。运算符可以把两个记号组合成一个记号。例如,可以这样做:defineXNAME(n)xn
然后,宏XNAME(4)将展开x4。以下程序演示运算符的用法:
输出结果为:
注意:PRINTXN()宏用运算符组合字符串,运算符把记号组合为一个新的标识符。
其实,运算符在这里看来并没有起到多大的便利,反而会让我们感觉到不习惯。但是,使用运算符有时候是可以提高封装性及程序的可读性的。比如上面的gpio驱动代码中:defineSTM32PIN(index,gpio,gpioindex){index,GPIOgpioCLKENABLE,GPIOgpio,GPIOPINgpioindex}
有些东西我们用得太少了,所以可能会误以为没有用,但实际上却是很有用的,我们应当要多积累各个知识点。
以上就是关于运算符与运算符的笔记,用运算符组合字符串,运算符把记号组合为一个新的标识符。如有错误欢迎指出。资料:RTThreadIoT代码、CPrimerPlus。