C语言宏定义中的令牌粘贴运算符

在C语言的宏定义中,## 是 令牌粘贴运算符(token-pasting operator),它用于将两个符号连接成一个新的符号。

//
// 静态内存缓冲
//
#define D_STATIC_BUFFER_DECLARE(vname, vsize) static uint8_t s_Buffer_##vname[vsize];static EOTBuffer vname = {0};
#define D_STATIC_BUFFER_INIT(vname, vsize) vname.buffer=s_Buffer_##vname;vname.size=vsize;vname.length=0;

在 D_STATIC_BUFFER_DECLARE(vname, vsize) 这个宏中:

static uint8_t s_Buffer_##vname[vsize];
  • ## 的作用是将 s_Buffer_ 和宏参数 vname 连接起来,形成一个新的变量名。

  • 例如,如果调用 D_STATIC_BUFFER_DECLARE(myBuf, 100),宏展开后会变成:

    static uint8_t s_Buffer_myBuf[100];
    static EOTBuffer myBuf = {0};
  • 这样,s_Buffer_##vname 就生成了一个唯一的静态数组名 s_Buffer_myBuf,避免与其他变量名冲突。

为什么需要这样做?

  1. 唯一性:确保每个声明的缓冲区都有一个唯一的内部存储数组名(基于 vname 参数)。

  2. 避免冲突:如果直接使用 vname 作为数组名,可能会与其他变量名冲突。加上 s_Buffer_ 前缀可以降低冲突概率。

  3. 关联性:通过命名规则(s_Buffer_xxx)表明这个数组是 xxx 的内部存储空间。

总结:

s_Buffer_##vname 的作用是动态生成一个与 vname 相关联的静态数组名,例如:

  • vname = myBuf → 数组名为 s_Buffer_myBuf

  • vname = data → 数组名为 s_Buffer_data

这是一种常见的宏技巧,用于生成唯一的变量名或函数名。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值