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)")

  • 相关阅读:
    第17章 委托
    第16章 数组
    第15章 枚举类型和位标志
    第14章 字符、字符串和文本处理
    第13章 接口
    第12章 泛型
    第10章 属性
    第11章 事件
    内部类(转载)
    Collections.sort的三种用法
  • 原文地址:https://www.cnblogs.com/chengbing2011/p/4083763.html
Copyright © 2011-2022 走看看