• C语言宏定义中的#,##,#@及\符号的作用


     1、stringizing字符串化操作符

              作用:将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串。其只能用于有传入参数的宏定   义中,且必须置于宏定义体中的参数名前。

              如:

    #define example(instr) printf("the input string is:\t%s\n",#instr)

    #define example1(instr) #instr

           当使用该宏定义时:

    example(abc);  在编译时将会展开成:printf("the input string is:\t%s\n","abc");

    string str=example1(abc);  将会展成:string str="abc";

    *注意:

      对空格的处理:

              a、忽略传入参数名前面和后面的空格。

                  如:str=example1(   abc ); 将会被扩展成 str="abc"

              b、当传入参数名间存在空格时,编译器将会自动连接各个子字符串,用每个子字符串之间以一个空格连接,忽略剩余空格。

                  如:str=exapme( abc    def); 将会被扩展成 str="abc def"

    2、## token-pasting符号连接操作符

       作用:将宏定义的多个形参转换成一个实际参数名。

        如:

               #define exampleNum(n) num##n

               int num9=9;

                 使用:

              int num=exampleNum(9); 将会扩展成 int num=num9;

                 注意:

            a、当用##连接形参时,##前后的空格可有可无。

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

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

        另:如果##后的参数本身也是一个宏的话,##会阻止这个宏的展开

        #define STRCPY(a, b)   strcpy(a ## _p, #b)

                int main()
                {
                    char var1_p[20];
                    char var2_p[30];
                    strcpy(var1_p, "aaaa");
                    strcpy(var2_p, "bbbb");
                    STRCPY(var1, var2);
                    STRCPY(var2, var1);
                    printf("var1 = %s\n", var1_p);
                    printf("var2 = %s\n", var2_p);
                    return 0;
                  
                   STRCPY(STRCPY(var1,var2),var2);
                   //这里是否会展开为: strcpy(strcpy(var1_p,"var2")_p,"var2“)?答案是否定的:
                   //展开结果将是:  strcpy(STRCPY(var1,var2)_p,"var2")
                   //## 阻止了参数的宏展开!如果宏定义里没有用到 # 和 ##, 宏将会完全展开
                }  

          3、#@ charizing字符化操作符

                 作用:将传入单字符参数名转换成字符以一对单引用括起来

           如:

                     #define makechar(x)  #@x

       a = makechar(b);

        展开后变成了:

       a= 'b';

       4、\ 续行操作符

             当定义的宏不能用一行表达完整时,可以用""表示下一行继续此宏的定义。注意\前留空格

    参考网址:
    http://blog.csdn.net/xdsoft365/archive/2010/09/28/5911596.aspx

                  http://blog.csdn.net/leng_que/archive/2010/11/06/5991697.aspx

                  http://yuxu9710108.blog.163.com/blog/static/237515342010629103421876/

                  http://blog.csdn.net/billpig/archive/2010/11/27/6039611.aspx

  • 相关阅读:
    Vue.nextTick()的介绍和使用场景
    JS实现数据双向绑定
    JS对象的可枚举属性和不可枚举属性
    JS中对象转数组方法总结
    Vmware虚拟机安装XP系统
    javascript和c#的深度拷贝的一种通用方法
    c# SQLServer导入大批量数据
    PowerDesigner逆向工程,从SQL Server数据库生成Physical Model -----数据源方式
    虚拟机和主机ping不通,SQL Server无法远程连接的解决方法
    c#生成试卷。。。
  • 原文地址:https://www.cnblogs.com/doctorqbw/p/2248628.html
Copyright © 2020-2023  润新知