C语言预处理之“##”和“#”的作用

双井号“##”

“##”在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");}                                        /*宏展开的结果*/

猜你喜欢

转载自blog.csdn.net/xinghuanmeiying/article/details/79235812