宏中的#

功能是将其后面的宏参数进行字符串化操作(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__的不同,前将带双引号,后一个没有双引号。

最新文章

  1. 开发OpenWrt路由器上LuCI的模块
  2. 浅谈A/B测试里常见的辛普森悖论,企业决策者必看
  3. 解决Kafka-1194问题
  4. javascript 变量,作用域,内存管理小结
  5. 看2016上半年O2O新风向,太阳终会穿破乌云
  6. hive中同列多行数据组合的方法以及array to string要点(行转列)
  7. cf B. Maximum Absurdity
  8. 手机触摸屏的JS事件
  9. oracle逗号字符串拼接小工具
  10. while100以内的偶数
  11. Python XML解析之ElementTree
  12. Jenkins + Ansible + Gitlab之ansible篇
  13. centos7/centos6修改系统默认语言
  14. 使用Stickers拓展集成iMessage简单功能
  15. C#多线程和异步(三)——一些异步编程模式
  16. 尚硅谷面试第一季-09SpringMVC中如何解决POST请求中文乱码问题GET的又如何处理呢
  17. centos 7.0 lnmp成功安装过程
  18. 目标检测之2015iccv---objdetection 专题论文
  19. POJ 1142:Smith Numbers(分解质因数)
  20. 【整理总结】代码沉淀 - CefSharp - 比较流行的第三方内嵌浏览器组件

热门文章

  1. Orale介绍
  2. 关于WPF中ItemsControl系列控件中Item不能继承父级的DataContext的解决办法
  3. 设置mariadb字符集为utf8
  4. ready是先执行的,load后执行,DOM文档的加载步骤
  5. Linux LVM过程问题
  6. BizTalk动手实验(十)业务活动监控(BAM)演示
  7. 【iCore3 双核心板】例程三十三:SD_IAP_ARM实验——更新升级STM32
  8. 精通JavaScript的this关键字
  9. Oracle-01033错误处理
  10. WordPress学习