宏定义中的#、#@与##

本文详细解读了C语言中宏定义中的#、#@与##用法,包括如何使用#为宏参数添加双引号,#@为单引号,以及##如何连接前后参数并去除空格完成强连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有些用法一般的C语言书籍中没有,但确实存在,如宏定义中的#、#@与##,说明如下:

1、#
为后面的宏形参添加双引号。
例:
#define SINGLESHARP(arg) #arg
SINGLESHARP(singlesharp) <==> "singlesharp"
2、#@
为后面的宏形参添加单引号。
例:
#define SINGLESHARPWITHAT(arg) #@arg
SINGLESHARPWITHAT(@) <==> '@'
3、##
连接##前后的两个宏形参。
具体的过程(为方便认知,主观认为如此,实际过程并非如此):
1)用空格替代##,则可以把宏分成几段,每段和宏形参比较,如果是宏形参,就用相应的实参替换;
2)去掉所有空格,连接这些段。
例:
#define A1(name, type)   type name_##type##_type
A1(a1, int);
步骤1,变为
type、name_、type、_type 四段,用实参替换,得到:int、name_、int、_type(注意name_和type_和前面面的形参并不符,所以没有替换);
步骤2,得到
int name_int_type;
-------------------------------------------------------------------------------
#define A2(name, type)   type name##_##type##_type
A2(a1, int);
步骤1,变为
type、name、_ 、type 、_type 五段,用实参替换,得到:int、a1、_、int、_type(注意和上面的例子对比);
步骤2,得到
int a1_int_type;
-------------------------------------------------------------------------------
验证##的去空格连接特性:
<##前后随意加上一些空格>
#define A1(name, type)   type name_   ##type ##_type 
#define A2(name, type)   type name ##_ ##type ##_type
结果是## 会把前后的空格去掉完成强连接,得到和上面结果相同的宏定义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值