博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
#、#@、## in C++宏定义
阅读量:6679 次
发布时间:2019-06-25

本文共 814 字,大约阅读时间需要 2 分钟。

字符串化操作  #

 

注意:

宏中遇到#或##时就不会再展开宏中嵌套的宏了

code:

1:  #define STRING(x) #x
2:  printf("%s\n", STRING(__FILE__));  /*指向"__FILE__"而不是"E:\\XXX.cpp"形式*/

结果:

 

 

code:

1:  printf("%s\n", __FILE__);

结果:

 

 

推荐使用

code:

1:  #define _STRING(x) #x
2:  #define STRING(x) _STRING(x)
3:  printf("%s\n", STRING(__FILE__));

结果:

 

 

字符化操作     #@

code:

1:  #define makechar(x)  #@x
2:  char ch = makechar(b);

结果:

 

 

符号拼接操作 ##

code:

1:  #define paster( n ) printf( "token"#n" = %d\n", token##n )
2:  int token9 = 100;
3:  paster( 9 );

结果:

 

 

解析:

宏展开后token##n直接合并变成了token9。整个语句变成了

1:  printf( "token""9"" = %d\n", token9 );

 

在C语言中字符串中的二个相连的双引号会被自动忽略,于是上句等同于

1:  printf("token9 = %d\n", token9);

 

     注意点:

   不要使用##连接字符串,字符串是直接拼接的。

     比如 生成 如xxx.cfg的字符串

           #file_name##".cfg"   vs能够正常拼接,但是当在linux下gcc编译时报错

           应修改为 #file_name".cfg"

转载于:https://www.cnblogs.com/liaokang/p/3638803.html

你可能感兴趣的文章
shell脚本之循环语句
查看>>
感到自己自私和无力
查看>>
更改EMC-Powerpath软件的路径工作模式
查看>>
软件管理
查看>>
[ Talk is Cheap Show me the CODE ] : jQuery Mobile
查看>>
LVM——逻辑卷管理
查看>>
离线安装gcc(CentOS7)
查看>>
客运车辆监管及运营平台
查看>>
eclipse添加注释
查看>>
贝叶斯估计和最大后验估计
查看>>
COBBLER无人值守安装
查看>>
基础知识--JAVA注解ElementType
查看>>
kickstart部署centos6.2 x86_64
查看>>
salt 的用户管理
查看>>
我封装的全文检索之solr篇
查看>>
NFC的第一次接触
查看>>
RHEL7 Connection closed by foreign host.
查看>>
Nodejs开发框架之Loopback介绍
查看>>
微信小程序下拉刷新使用整理
查看>>
ubuntu12.04禁用客人会话
查看>>