在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
,避免与其他变量名冲突。
为什么需要这样做?
-
唯一性:确保每个声明的缓冲区都有一个唯一的内部存储数组名(基于
vname
参数)。 -
避免冲突:如果直接使用
vname
作为数组名,可能会与其他变量名冲突。加上s_Buffer_
前缀可以降低冲突概率。 -
关联性:通过命名规则(
s_Buffer_xxx
)表明这个数组是xxx
的内部存储空间。
总结:
s_Buffer_##vname
的作用是动态生成一个与 vname
相关联的静态数组名,例如:
-
vname = myBuf
→ 数组名为s_Buffer_myBuf
-
vname = data
→ 数组名为s_Buffer_data
这是一种常见的宏技巧,用于生成唯一的变量名或函数名。