文档章节

C中的宏的使用(宏嵌套/宏展开/可变参数宏)

SamXIAO
 SamXIAO
发布于 11/17 21:57
字数 480
阅读 11
收藏 0

基本原则:

在展开当前宏函数时,如果形参有#或##则不进行宏参数的展开,否则先展开宏参数,再展开当前宏。

#是在定义两边加上双引号

#define _TOSTR(s) #s

printf(_TOSTR(test ABC))
printf(_TOSTR("test ABC"));
printf(_TOSTR(_TOSTR(test ABC)));

==================
预编译结果:
printf("test ABC")
printf("\"test ABC\"");
printf("_TOSTR(test ABC)");

##是原样代入

 

#define HI_BOY HiBoy!
#define __ORIGINAL(s) s
#define _TOSTR(s) #s
#define STR_CONCAT(x, y) x##y

printf(HI_BOY);
printf(__ORIGINAL(HI_BOY));
printf(_TOSTR(HI_BOY));
printf(_TOSTR(__ORIGINAL(HI_BOY)));
printf(STR_CONCAT(HI_BOY, HI_BOY ));
printf(STR_CONCAT(_TOSTR(HI_BOY), _TOSTR(HI_BOY) ));
===========================================================
预处理后的结果:
printf(HiBoy!);
printf(HiBoy!);
printf("HI_BOY");
printf("__ORIGINAL(HI_BOY)");
printf(HI_BOYHI_BOY);
printf("HI_BOY" "HI_BOY");

连续的两个双引号会被忽略掉

以下写法结果一样:

printf("this is a test sentence. are you ok?\n");
printf("this is a test ""sentence."" are you ok?\n");
printf("this is a test sentence."   " are you ok?\n");
printf("this is a"           " test ""sentence. are"" you ok?\n");

==============
this is a test sentence. are you ok?
this is a test sentence. are you ok?
this is a test sentence. are you ok?
this is a test sentence. are you ok?

嵌套

#define  QUOTATION "
#define HI_BOY HiBoy!
#define __ORIGINAL(s) s
#define _TOSTR(s) #s
#define STR_CONCAT(x, y) x##y

printf(HI_BOY);
printf(__ORIGINAL(HI_BOY));
printf(_TOSTR(HI_BOY));
printf(_TOSTR(__ORIGINAL(HI_BOY)));
printf(STR_CONCAT(HI_BOY, HI_BOY ));
printf(STR_CONCAT( _TOSTR(HI_BOY), _TOSTR(HI_BOY) ));
printf(                  STR_CONCAT( __ORIGINAL(HI_BOY), __ORIGINAL(HI_BOY) ));
printf(           _TOSTR(STR_CONCAT( __ORIGINAL(HI_BOY), __ORIGINAL(HI_BOY) )));
printf(_TOSTR(__ORIGINAL(STR_CONCAT( __ORIGINAL(HI_BOY), __ORIGINAL(HI_BOY) ))));
printf(           ""(STR_CONCAT( __ORIGINAL(HI_BOY), __ORIGINAL(HI_BOY) ))"");
printf(_TOSTR(__ORIGINAL(STR_CONCAT( __ORIGINAL(HI_BOY), __ORIGINAL(HI_BOY) ))));
printf(           QUOTATION(STR_CONCAT( __ORIGINAL(HI_BOY), __ORIGINAL(HI_BOY) ))QUOTATION);
printf(           QUOTATION STR_CONCAT( __ORIGINAL(HI_BOY), __ORIGINAL(HI_BOY) )QUOTATION);


==================================================
预编译结果:
printf(HiBoy!);
printf(HiBoy!);
printf("HI_BOY");
printf("__ORIGINAL(HI_BOY)");
printf(HI_BOYHI_BOY);
printf("HI_BOY" "HI_BOY");
printf(                  HiBoy!HiBoy!);
printf(           "STR_CONCAT( __ORIGINAL(HI_BOY), __ORIGINAL(HI_BOY) )");
printf("__ORIGINAL(STR_CONCAT( __ORIGINAL(HI_BOY), __ORIGINAL(HI_BOY) ))");
printf(           ""(HiBoy!HiBoy!)"");
printf("__ORIGINAL(STR_CONCAT( __ORIGINAL(HI_BOY), __ORIGINAL(HI_BOY) ))");
printf(           "(HiBoy!HiBoy!)");
printf(           " HiBoy!HiBoy! ");

参考

 https://blog.csdn.net/Pillary/article/details/53705158

© 著作权归作者所有

共有 人打赏支持
SamXIAO
粉丝 1
博文 67
码字总数 21618
作品 0
部门经理
私信 提问
用可变参数宏(variadic macros)传递可变参数表

用可变参数宏(variadic macros)传递可变参数表 注意:VAARGS 从VS2005才开始支持 =========== 在 GNU C 中,宏可以接受可变数目的参数,就象函数一样,例如: #define prdebug(fmt,arg...) ...

Start-up
2012/10/19
0
0
“宏”以及 release 时去掉nslog的方法&&可变参数宏

release 时去掉nslog的方法 #ifdef i386 # define NSLog(...) NSLog(VAARGS_) #else # define NSLog(...) {} // NSLog(...) 代表{},相当于 用{}代替NSLog(...) #endif 上例是用C99标准中......

JohnZr
2012/09/19
0
0
“#”的迷雾

在代码中使用Autolayout时,大家都会使用这个宏,这个宏可以生成一个变量名到变量值映射的Dictionary。比如将会生成一个的Dictionary。它是怎么做到的呢?我们来看看这个宏的定义: 这个宏定...

hejunbinlan
2016/08/01
5
0
关于GCC和C99中可变参数宏

参考文章:http://blog.csdn.net/woshinia/article/details/8255693 首先介绍一下预处理连接符“##”,其作用是将两个符号连接成一个,即当可变参数VAARGS_的个数为0时,##负责把前面多余的‘...

雪色梦貘
2014/03/12
0
0
宏定义中的#,##,...,do{}while(0),__VA_ARGS__

宏定义中的#,## 1.在一个预处理器宏中的参数前面使用一个#,预处理器会把这个参数转换为一个字符数组 #define syslog(a) fprintf(stderr,"Warning: " #a"n"); 2.简单的说,“## ”是一种分隔连...

Linux_woniu
2017/09/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【阿里面试系列】之前有人问过我一个这样的面试题

文章简介 很多人对Thread.join的作用以及实现了解得很少,毕竟这个api我们很少使用。这篇文章仍然会结合使用及原理进行深度分析 扩展阅读: 「阿里面试系列」搞懂并发编程,轻松应对80%的面试...

Java架构资源分享
1分钟前
0
0
CentOS 7.2 yum方式安装MySQL 5.7

CentOS 7.2 yum方式安装MySQL 5.7 CentOS 7之后的版本yum的默认源中使用MariaDB替代原先MySQL,因此安装方式较为以往有一些改变: 下载mysql的源 wget http://dev.mysql.com/get/mysql57-co...

yizhichao
1分钟前
0
0
nginx-tutorial

Nginx 本项目是一个 Nginx 极简教程,目的在于帮助新手快速入门 Nginx。 demos 目录中的示例模拟了工作中的一些常用实战场景,并且都可以通过脚本一键式启动,让您可以快速看到演示效果。 <!...

吴伟祥
2分钟前
0
0
分布式系统下的Session共享问题

分布式系统下的Session共享问题 分布式服务器有多台,用nginx做负载均衡,这样同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登...

晨猫
7分钟前
0
0
2018 中国短视频开发者创意大赛震撼来袭,万元现金大奖邀你来战!

当下,短视频 App 已成为各个年龄层最火最潮的应用,而在短视频行业发展如火如荼时,又掀起了一轮潮流新玩法的探讨,为短视频新形势下提供更多可能性。2018 年 12 月 3 日,中国短视频开发者...

七牛云
10分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部