关于记号粘贴操作符(token paste operator): `##`
来源:互联网 发布:rf mems 知乎 编辑:程序博客网 时间:2024/06/06 09:44
关于记号粘贴操作符(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##_typeA1(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"
.
- 关于记号粘贴操作符(token paste operator): `##`
- 预处理定义操作符Stringizing Operator (#) ,Charizing Operator (#@), Token-Pasting Operator (##)
- 【C++】预处理定义操作符Stringizing Operator (#) ,Charizing Operator (#@), Token-Pasting Operator (##)
- 预处理定义操作符Stringizing Operator (#) ,Charizing Operator (#@), Token-Pasting Operator (##)
- 预处理器 - 记号传递操作符##
- Android 拷贝/粘贴(Copy/Paste)
- operator操作符
- operator 操作符重载
- 操作符(operator)
- VEX Operator(操作符)
- 重载operator操作符
- j2ee Operator 操作符
- C++ 操作符重载 operator = 、operator <
- C++ 操作符重载 operator = 、operator <
- operator* operator-> 操作符的使用
- token pasting operator ##
- Android Copy and Paste 复制粘贴
- vim中粘贴保留格式 :set paste
- 华为机试题目 若干
- js this问题
- C#判断Sql攻击
- html学习笔记(15)
- 在Ubuntu和debian上安装OpenCV
- 关于记号粘贴操作符(token paste operator): `##`
- sql 面试题
- UI09_自定义cell
- 解决webrtc iOS 编译错误 Multiple codesigning问题
- Message Digests和Digital Signature (信息摘要和数字签名的区别),MD5、RSA、SHA
- [leetcode] Palindrome Number 回文数判断
- nodejs+express+mongodb
- jsp+servlet 学生登陆查询系统
- hdu 5288 OO’s Sequence(two pointers)