C++/C 宏定义(define)中# ## 的含义
来源:互联网 发布:php object to string 编辑:程序博客网 时间:2024/04/24 22:12
原文链接:http://blog.csdn.net/qq_15457239/article/details/56842450
#define f(a,b) a##b
#define d(a) #a
#define s(a) d(a)
void main( void )
{
puts(d(f(a,b)));
puts(s(f(a,b)));
}
输出结果:
f(a,b)
ab
分析: ##把两个符号连起来
#a指把a当成符号,就是把#后面的看成字符串
# 和 ## 操作符是和#define宏使用的. 使用# 使在#后的首个参数返回为一个带引号的字符串. 例如, 命令
#define to_string( s ) # s
将会使编译器把以下命令
cout < < to_string( Hello World! ) < < endl;
理解为
cout < < "Hello World!" < < endl;
使用##连结##前后的内容. 例如, 命令
#define concatenate( x, y ) x ## y
...
int xy = 10;
...
将会使编译器把
cout < < concatenate( x, y ) < < endl;
解释为
cout < < xy < < endl;
理所当然,将会在标准输出处显示'10'.
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");
#define f(a,b) a##b
#define d(a) #a --》 以"#"开头的,直接替换,不展开:immediately replaced by the unexpanded actual argument
#define s(a) d(a) --》 非以"#"开头的,先展开,再替换,也就是一般的情况
所以就两种情况:
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)")
- C++/C 宏定义(define)中#和## 的含义
- C++/C 宏定义(define)中# ## 的含义
- C++/C 宏定义(define)中# ## 的含义
- C++/C 宏定义(define)中# ## 的含义 宏拼接
- C++/C 宏定义(define)中# ## 的含义(转)
- C++/C 宏定义(define)中# ## 的含义(转)
- C宏定义中## 和# 的含义
- C语言#define宏中省略号的含义?
- C语言#define宏中省略号的含义
- C++/C宏定义中##与#的含义
- C宏定义#define
- C宏定义# ##含义
- C语言宏定义中UL的含义
- C语言中宏定义(#define)时do{...}while(0)的价值
- C语言-#define宏定义
- C-049.宏定义#define
- C/C++中export的定义 C++/C宏定义中## 连接符与# 符的含义
- C/C++: const常量与define宏定义的区别
- 记录下HTTP中的一些琐碎
- 关于用户访问请求慢,TTFB时间长的问题分析
- 论extern "C"的用处?
- Android 6.0动态权限申请问题
- 关于html中meta viewport属性
- C++/C 宏定义(define)中# ## 的含义
- caffe 中的一些参数介绍
- PyTorch 深度学习:60分钟快速入门
- SolrCloud Collection 创建
- opengl es文档
- ZigZag Conversion--LeetCode
- OpenG数组讲解之Filter 1D Array。
- redis-GEO地理位置
- IO和NIO操作文件的对比