美文网首页嵌入式软件程序员
C语言宏定义##和#符的使用总结

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

作者: 华杰研习社 | 来源:发表于2018-07-12 18:06 被阅读13次

            最近在查找激光甲烷遥测仪有些主控板启动不了的原因时,顺便研究了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语言宏定义##和#符的使用总结

        本文链接:https://www.haomeiwen.com/subject/noyrpftx.html