美文网首页
宏定义中的#和##

宏定义中的#和##

作者: WebSSO | 来源:发表于2017-09-13 15:04 被阅读15次

http://www.cnblogs.com/mydomain/archive/2010/09/25/1834917.html

在一个预处理器宏中的参数前面使用一个#,预处理器会把这个参数转换为一个字符数组

#是“字符串化”的意思。出现在宏定义中的#是把跟在后面的参数转换成一个字符串

> #define STRCPY(dst, src)  strcpy(dst, #src)

> STRCPY(buff, abc)

相当于strcpy(buff, "abc")

如果##后的参数本身也是一个宏的话,##会阻止这个宏的展开,也就是只替换一次

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

/*注意这里*/

STRCPY(STRCPY(var1,var2),var2);

/*这里是否会展开为:strcpy(strcpy(var1_p,"var2")_p,"var2“)?

*答案是否定的:

*展开结果将是:strcpy(STRCPY(var1,var2)_p,"var2")

* ##阻止了参数的宏展开!

*如果宏定义里没有用到#和##,宏将会完全展开

*/

简单的说,“##”是一种分隔连接方式,它的作用是先分隔,然后进行强制连接。

其中,分隔的作用类似于空格。我们知道在普通的宏定义中,预处理器一般把空格解释成分段标志,对于每一段和前面比较,相同的就被替换。但是这样做的结果是,被替换段之间存在一些空格。如果我们不希望出现这些空格,就可以通过添加一些##来替代空格。

相关文章

  • c高级自我学习(1)

    1 编译预处理和宏定 #undef指令删除前面定义的宏定义。 无参宏定义:宏名中没有参数。 1,宏定义中宏名用来表...

  • swift&&OC

    宏定义 OC中的宏定义 swift中的宏定义 OC中宏定义的方式,在swift中是不可用的,在swift中,宏定义...

  • 宏定义中的#和##

    http://www.cnblogs.com/mydomain/archive/2010/09/25/183491...

  • 宏定义中 # 和 ## 的作用

    宏定义中 # 和 ## 的作用

  • 10/19

    今天老师讲了预处理命令,宏定义分为无参宏定义,带参宏定义和条件编译。宏定义包括宏名和宏展开,和函数相比预处理有很多...

  • ReactiveCocoa 之 @weakify/@strong

    @weakify 和 @strongify 是 RAC 中对于强弱引用操作的宏定义。 1. 拆解宏定义 下面的代码...

  • redis源码3--链表list

    源码文件在 adlist.h 和 adlist.c 中 结点的定义 迭代器的定义 双端链表结构 宏定义 宏函数 主...

  • 5月31

    今天学习了宏定义 宏定义分为:不带参数的宏定义和带参数的宏定义,不占用任何内存空间,宏定义时不加分号。 #defi...

  • C语言中的预处理器(二)

    预定义宏 ANSI C 定义了许多宏。在编程中您可以使用这些宏,但是不能直接修改这些预定义的宏。简而言之,预定义宏...

  • C语言宏定义中#和##的作用

    在宏定义中#和##的作用是:前者将宏定义的变量转化为字符串;后者将其前后的两个宏定义中的两个变量无缝拼接在一起转化...

网友评论

      本文标题:宏定义中的#和##

      本文链接:https://www.haomeiwen.com/subject/uhzksxtx.html