双井号“##”
“##”在C语言中被称为连接符(concatenator),它用来连接两个Token为一个Token(Token是编译原理中的概念,编译器在编译源程序时,会首先扫描源代码,将代码分解为一个一个的Token,Token可以是C语言的关键字,如int、for、while等,也可以是用户自定义变量,如string、num、a等)。例如下面代码中的宏:
#define LWIP_MEMPOOL(name, num, size, desc) MEMP_##name /*宏定义*/
LWIP_MEMPOOL(example, num, size, desc) /*宏调用*/
MEMP_example /*宏展开的结果*/
单井号“#”
“#”经常会在C语言的宏定义中被使用到,“#”的功能是将其后的宏参数进行字符串化(Stringfication),简单说就是将其所引用的宏变量字符串化,即在相应变量的左右各加上一个双引号。例如下面代码中的宏:
#define ERROR_IF(expression) {if(expression) printf("error:"#expression"\n");}/*宏定义*/
ERROR_IF(a==b) /*宏调用*/
{if(a==b) printf("error:""a==b""\n");} /*宏展开的结果*/