关于记号粘贴操作符(token paste operator): `##`
2015-08-13 21:13
337 查看
关于记号粘贴操作符(token paste operator): ##
1 简单的说, ##是一种分割连接方式, 它的作用是先分隔, 然后进行强制连接.
其中, 分隔的作用类似于空格. 我们知道在普通的宏定义中, 预处理器一般把空格解释成分段标志. 对每一段和前面比较,相同的就被替换. 但这样做的结果是, 被替换段之间存在一些空格. 如果我们不希望出现这些空格,就可以通过添加一些##来代替空格.
另外一些分隔标志是, 包括操作符, 比如
+,-,*,/,[,],...,所以尽管下面的宏定义没有空格, 但是依然表达有意义的定义:
#define add(a,b) a+b
而其强制连接的作用是,去掉和前面的字符串之间的空格,而把两者连接起来.
2 举例 – 试比较下下述几个宏定义的区别
#define A1(name,type) type name_##type##_type #define A2(name, type) type name##_##type##_type A1(a1, int); /* 等价于: int name_int_type; */ A2(a1, int); /* 等价于: int a1_int_type; */
解释:
(1). 在第一个宏定义中,
name和第一个
_之间,以及第2个
_和第二个
type之间没有被分隔,所以预处理器会把
name_##type##_type解释成3段:
name_、
type、以及
_type,这中间只有
type是在宏前面出现过的,所以它可以被宏替换.
(2). 而在第二个宏定义中,
name和第一个
_之间也被分隔了,所以预处理器会把
name##_##type##_type解释成4段:
name、
_、
type以及
_type,这其间,就有两个可以被宏替换了.
(3). A1和A2的定义也可以如下:
#define A1(name, type) type name_ ##type ##_type /* ##前面随意加上一些空格 */ #define A2(name, type) type name ##_ ##type ##_type
结果是##会把前面的空格去掉完成强连接,得到和上面结果相同的宏定义
3 其他相关 – 单独的一个
#
至于单独一个
#,则表示对这个变量替换后,再加双引号引起来。比如:
#define __stringify_1(x) #x. 那么,
__stringify_1(linux) <==> "linux".
相关文章推荐
- C/C++ 宏详细解析
- 深入探讨:宏、内联函数与普通函数的区别
- C++十六进制宏的用法详解
- C++基础入门教程(二):数据、变量、宏等
- 枚举和宏的区别详细解析
- 浅析c++ 宏 #val 在unicode下的使用
- 如何在C语言的宏中使用类型关键字
- 树形结构
- 巧用可变参数宏、编译器内置宏和printf输出调试信息
- 用宏获取函数名
- C语言之“宏”
- do...while(0)在宏定义中的巧妙用法
- do...while(0)在宏定义中的巧妙用法
- 万能类型的设计
- office(excel/word/ppt)宏工程,vba工程密码去除
- C/C++预处理器总结
- 黑马程序员---【C语言】06预处理命令
- typedef和define区别
- 头文件卫士
- BOOST_PP_CAT宏