C 注释]# 运算符和 ## 运算符
最编程
2024-04-13 21:07:35
...
1、#运算符
我们平时使用带参宏时,字符串中的宏参数是没有被替换的。例如:
输出结果为:
然而,我们期望输出的结果是:
5 + 20 = 25
13 + 14 = 27
这该怎么做呢?其实,C语言允许在字符串中包含宏参数。在类函数宏(带参宏)中,#号
作为一个预处理运算符
,可以把记号转换成字符串
。例如,如果A是一个宏形参,那么#A就是转换为字符串”A”的形参名。这个过程称为字符串化(stringizing)
。以下程序演示这个过程:
输出结果为:
这就达到我们想要的结果了。所以,#运算符
可以完成字符串化(stringizing)
的过程。
2、##运算符
与#运算符类似,##运算符
可用于类函数宏(带参宏)的替换部分。##运算符
可以把两个记号组合成一个记号。例如,可以这样做:
#define XNAME(n) x##n
然后,宏XNAME(4)将展开x4。以下程序演示##运算符的用法:
输出结果为:
注意: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}
然后这就可以很方便的将要使用的硬件引脚这么一一列出来,然后再拿去进行配置:
以上就是关于#运算符与##运算符的笔记,用#运算符组合字符串,##运算符把记号组合为一个新的标识符。如有错误欢迎指出。资料:『RT-Thread-IoT代码』、『C Primer Plus』。
下一篇: 构建平衡二叉树 C 语言示例
推荐阅读
-
[Fixed] 理解 C# 位运算:掌握位运算符的妙用
-
[C 语言深度分析] 您真的了解 C 语言中的位运算符吗? 位和、位或、位异或)(代码示例 + 详细图解
-
ES6 链式判断运算符 (?...) 和 Null 判断运算符 (???)
-
替代运算符和标记 - [ C 语言中文开发手册 ] - 本地在线手册 - php中文网
-
我的 Java 学习笔记(3):基本输入和输出语句、运算符表达式
-
java 的比较运算符 "比较和至上的用法 "的结果 英语语法 - 比较和至上的用法 - KingOrchidTutorials.com...
-
[c++] cout 格式化输出,流操作运算符
-
C 语言注释 07_枚举和指针
-
C 语言的按位清 0 和置 1 运算(与移位运算符组合一致的按位运算) - 第二,移位运算符
-
C 语言中最完整的运算符解释,一文读懂所有运算符!