C语言宏定义##和#符的使用总结

        最近在查找激光甲烷遥测仪有些主控板启动不了的原因时,顺便研究了TMS320VC5509A和STM32F407之间通过HPI接口的程序引导和利用CSL产生的HPI接口底层驱动程序,其中HPI接口底层驱动程序中使用了##连接符,现将C语言宏定义中的##和#符使用方法做一下总结:

1、#符

1)、定义

        在C语言的宏定义中,#的功能是将其后面的宏参数进行字符串化操作,即是在对它所引用的宏变量进行替换后在其左右各加上一个双引号。

2)、实例

        比如下面代码中的宏:

#define WARN_IF(EXP)    do{ if (EXP)    fprintf(stderr, "Warning: " #EXP "/n"); }  while(0)

那么在实际使用中的替换过程为:假如:WARN_IF (divider == 0);

被替换过程为

do {

if (divider == 0)

fprintf(stderr, "Warning" "divider == 0" "/n");

} while(0);

这样每次divider(除数)为0的时候便会在标准错误流上输出一个提示信息。

3)、注意事项

(1)对空格的处理

忽略传入参数名前面和后面的空格。如:str=example1( abc ); 将会被扩展成 str="abc";

(2)当传入参数名间存在空格时,编译器将会自动连接各个子字符串,用每个子字符串中只以一个空格连接,忽略其中多余一个的空格。如:str=exapme( abc def); 将会被扩展成 str="abc def";

(3)转义字符

某些形式的传入参数名中,若存在特殊字符,编译器会自动为其添加转义字符号'\'。

如:string str=example1("escap'\e"); 相当于:str="\"escap\'\\e\"";

2、##符

1)、定义

        在C语言的宏定义中,##被称为连接符,用来将两个Token连接为一个Token。

2)、实例

比如:#define LINK_MULTIPLE(a,b,c,d) a##_##b##_##c##_##d

typedef struct _record_type LINK_MULTIPLE(name,company,position,salary);

// 这里这个语句将展开为:

// typedef struct _record_type name_company_position_salary;

3)、注意事项

(1)当用##连接形参时,##前后的空格可有可无。

如:#define exampleNum(n) num ## n 相当于 #define exampleNum(n) num##n

(2)连接后的实际参数名,必须为实际存在的参数名或是编译器已知的宏定义。

你可能感兴趣的:(C语言宏定义##和#符的使用总结)