• 宏定义中的#


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

    来源: 刘诗慧Rubby的日志

     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

     

    源地址:http://blog.renren.com/GetEntry.do?id=736064665&owner=382496004

  • 相关阅读:
    ASP.NET和PHP全面对比
    GridView事件DataBinding,DataBound,RowCreated,RowDataBound区别及执行顺序分析
    OA、CRM、ERP之间的区别和联系是什么?
    C#继承
    对软件项目管理的几点认识
    冒泡
    经典排序算法
    asp.net遍历页面中所有TextBox,并赋值为String.Empty的方法
    String.Format用法
    frame和iframe
  • 原文地址:https://www.cnblogs.com/Lyush/p/2451729.html
Copyright © 2020-2023  润新知