C/C++ 宏中的 #、#@、##的作用
宏中的# |
功能是将其后面的宏参数进行字符串化操作(Stringizing operator), 简单说就是在它引用的宏变量的左右各加上一个双引号。 |
#define STRING(x) #x 下面二条语句就等价。 char *pChar = "hello"; char *pChar = STRING(hello); |
宏中的#@ | 加单引号(Charizing Operator) |
#define makechar(x) #@x char ch = makechar(b);与char ch = 'b';等价。 |
宏中的## | 它可以拼接符号(Token-pasting operator)。 | #define paster( n ) printf( "token"#n" = %d\n", token##n )
int token9 = 100; 再调用 paster(9);宏展开后token##n直接合并变成了token9。整个语句变成了 printf( "token""9"" = %d", token9 ); 在C语言中字符串中的二个相连的双引号会被自动忽略,于是上句等同于 printf("token9 = %d", token9);。 即输出token9 = 100 |
有小问题要注意,宏中遇到#或##时就不会再展开宏中嵌套的宏了。比如使用char *pChar =STRING(__FILE__);
虽然__FILE__本身也是一个宏,但编译器不会展开它,所以pChar将指向"__FILE__"而不是你要想的形如"D:\XXX.cpp"的源文件名称。
因此要加一个中间转换宏,先将__FILE__解析成"D:\XXX.cpp"字符串。
定义如下所示二个宏:
#define _STRING(x) #x
#define STRING(x) _STRING(x)
再调用下面语句将输出带""的源文件路径
char* pChar = STRING(__FILE__);
printf("%s %s\n", pChar, __FILE__);
可以比较下STRING(__FILE__)与__FILE__的不同,前将带双引号,后一个没有双引号。
最新文章
- 开发OpenWrt路由器上LuCI的模块
- 浅谈A/B测试里常见的辛普森悖论,企业决策者必看
- 解决Kafka-1194问题
- javascript 变量,作用域,内存管理小结
- 看2016上半年O2O新风向,太阳终会穿破乌云
- hive中同列多行数据组合的方法以及array to string要点(行转列)
- cf B. Maximum Absurdity
- 手机触摸屏的JS事件
- oracle逗号字符串拼接小工具
- while100以内的偶数
- Python XML解析之ElementTree
- Jenkins + Ansible + Gitlab之ansible篇
- centos7/centos6修改系统默认语言
- 使用Stickers拓展集成iMessage简单功能
- C#多线程和异步(三)——一些异步编程模式
- 尚硅谷面试第一季-09SpringMVC中如何解决POST请求中文乱码问题GET的又如何处理呢
- centos 7.0 lnmp成功安装过程
- 目标检测之2015iccv---objdetection 专题论文
- POJ 1142:Smith Numbers(分解质因数)
- 【整理总结】代码沉淀 - CefSharp - 比较流行的第三方内嵌浏览器组件