c语言的#和##的用法
#include <stdio.h>
#define ADD(A,B) printf(#A " + " #B " = %d\n",((A)+(B)))
#define XNAME(n) x ## n
#define PRINT_XN(n) printf("x" #n " = %d\n", x ## n)
int main(void)
{
ADD(4,5);
int XNAME(1) = 14;
PRINT_XN(1);
return 0;
}
再次学习一下后两个还定义的小技巧,在vscode中可以把鼠标放到代码中,可以看到宏定义展开的最终结果。这个编辑器,值得推荐,我主打用他来写代码的。
1、如果A是一个宏形参,那么#A就是转换为字符串"A"的形参名。这个过程称为字符串化(stringizing)
2、与#运算符类似,##运算符可用于类函数宏(带参宏)的替换部分。##运算符可以把两个记号组合成一个记号。
运行结果:
##运算符在这里看来并没有起到多大的便利,反而会让我们感觉到不习惯。但是,使用##运算符有时候是可以提高封装性及程序的可读性的。如跑实时操作系统的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}
然后这就可以很方便的将要使用的硬件引脚这么一一列出来,然后再拿去进行配置