最近在查找激光甲烷遥测仪有些主控板启动不了的原因时,顺便研究了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)连接后的实际参数名,必须为实际存在的参数名或是编译器已知的宏定义。
网友评论