zoukankan      html  css  js  c++  java
  • C++宏定义中"#"与"##"的妙用

    在C++开发当中经常用到宏的定义当中使用"#"或者"##",以下是对着两种符号使用方法的简单描述:

    define中的#就是把#后面的参数当做一个符号来使用,简单的说就是把它当做字符串连接起来,##连接前后2个符号, define定义中以#开头的宏直接替换不展开,以非#开头的宏先展开再替换。

    如下:

    #define f(a,b) a##b

    #define d(a) #a

    #define s(a) d(a)

    puts(d(f(a,b))); 输出结果: f(a,b)

    puts(s(f(a,b))); 输出结果: ab

    展开的过程如下:

    puts(d(f(a,b))); ----> 因为d宏的定义以#开头,宏中的参数是另外一个宏,且带##,所以作为参数的宏不展开,相当于puts(#f(a,b));----->puts("f(a,b)");

    puts(s(f(a,b))); ----> 因为s宏的定义不以#开头,宏中的参数是另外一个宏,但不带##,所以作为参数的宏先展开,相当于

    puts(s(ab));----->puts(d(ab));---->puts(#ab);---->puts("ab");

    综上所述有以下2中情况: 1.不以"#"开头的,先展开参数a,然后是替换代码:

    puts(s(f(a,b)));-->puts(s(ab))-->puts(d(ab))-->puts("ab")

    2.以"#"开头的,直接替换,不展开:

    puts(d(f(a,b)))-->puts("f(a,b)")

  • 相关阅读:
    [NOIP2008] 提高组 洛谷P1125 笨小猴
    洛谷P3384 【模板】树链剖分
    Bzoj1503 [NOI2004]郁闷的出纳员
    POJ1422 Air Raid
    洛谷P1133 教主的花园
    洛谷P1186 玛丽卡
    HDU5115 Dire Wolf
    POJ1308 Is It A Tree?
    POJ2513 Colored Sticks
    Bzoj2326 [HNOI2011]数学作业
  • 原文地址:https://www.cnblogs.com/chengbing2011/p/4083763.html
Copyright © 2011-2022 走看看