zoukankan      html  css  js  c++  java
  • 参考http://www.cnblogs.com/openix/admin/EditPosts.aspx?opt=1

    宏:

    #define OW “I lo\

    ve you”

    输出:I love you

     #define OW “I lo\

        ve you”

    输出:I lo  ve you

     #define OW “I lo”\

                      “ve you”

    输出:I love you

    利用宏参数创建字符串:#运算符

    #define PSQR(X) printf(“The square of X is %d\n”,((X)*(X))

    则:

    PSQR(8)输出:The square of X is 64

    因此我们这里的双引号中的X被当成是个字符

    而#符号用作一个预处理运算符,它可以将语言符号转化为字符串,例如X是一个宏参量,那么#X可以把参数名转化为相应的字符串。例如

    #define PSQR(x) printf(“The square of “ #x “is %d\n”,((X)*(X))

    则:

    PSQR(8) 输出:The square of 8 is 64

    或者,如我我们定义int y=8;

    则:PSQR(y) 输出:The square of y is 64

    cpp的粘合剂:##运算符

    例如:

    #define cmd(name)\

    cmd_tbl cmd_##name

    故有:

    cmd(bootm);

    为:cmd_tbl cmd_bootm;

    可变宏:…和__VA_ARGS__    执行C99标准

    实际思想就是宏定义中参数列表的最后一个参数为三个句号。这样,预定义宏__VA_ARGS__就可以被用在替换部分中,以表明省略号代表什么。

    例如:

    #define PR(…) printf(__VA_ARGS__)

    则PR(“Howdy”);展开为:printf(“Howdy”);

       PR(“weight = %d, shipping =%.2f\n”,wt,sp);展开为:printf(“weight =%d,shipping =%.2f\n”,wt,sp);

    //程序variadic.c

    #include<stdio.h>

    #incude<math.h>

    #define PR(X,…) printf(“Message “ #x”: “ __VA_ARGS__)

    int main(void)

    {
             double x=48;

    double y;

    y=sqrt(x);

    PR(1,”x= %g\n”,x);

    PR(2,”x =%.2f, y=%.4f\n”,x,y);

    return 0;

    }

     

    第一个宏展开为printf(”Message “ “1” “: “ “x=%g\n”,x);

    第二个宏展开为printf (“Message “ “2” “: “ “x=%.2f, y=%.4f\n”,x,y);

    关于参数个数可变宏中最后一个逗号的处理:

    #define debug(fmt, arg...)  printf(fmt, ##arg)

    该处对可变参数的名字自己做了定义,且定义位arg,不再使用__VA_ARGS__,当我们调用debug时,至少有一个参数,也是对的:##arg意味着可以没有可变参数个数,并且当没有可变参数时由cpp去掉其前的逗号(GCC支持)

    #define debug(fmt, arg, ...) printf(fmt, arg, ##__VA_ARGS__)

    该处没有对可变参数定义自己的名字,必须使用__VA_ARGS__,当我们调用debug时,至少有两个参数:##__VA_ARGS__意味着可以没有可变参数个数,并且当没有可变参数时由cpp去掉其前的逗号(GCC支持)

    注意,对于上述两种情形,一定不能写成如下两种形式:

    #define debug(arg...)  printf(##arg)

    #define debug (...) printf(##__VA_ARGS__)

    这两种写法时错的,因为##意味着前边必定有逗号,所以错了

    但是下列写法时对的:

    #define debug(arg...)  printf(arg)

    #define debug(...) printf(__VA_ARGS__)

    当然,这时要是使用的话就必须至少有一个参数

  • 相关阅读:
    Vue学习之webpack中使用vue(十七)
    Vue学习之Babel配置(十六)
    Vue学习之webpack调用第三方loader(十五)
    JAVA基础之设置随机成语验证码
    JAVA基础之HttpServletResponse响应
    Vue学习之npm常用命令及参数小结(十四)
    EXCEL 查找某个字符在字符串中最后一次出现的位置
    SQLSERVER存储过程基本语法
    SQL SERVER 字符串函数 STRING_SPLIT()
    SQL SERVER 字符串函数 PATINDEX()
  • 原文地址:https://www.cnblogs.com/openix/p/2367557.html
Copyright © 2011-2022 走看看