C语言宏嵌套问题
来源:互联网 发布:合肥骆岗机场知乎 编辑:程序博客网 时间:2024/05/02 23:32
#define f(a,b) a##b #define g(a) #a #define h(a) g(a) int main() { printf("%s,", h(f(1,2))); printf("%s\n",g(f(1,2))); return 0; }
输出为什么??????????
C语言中的宏是个鸡肋,用得好可以大大减少编码量,用的不好连错在哪里都不知道。最近发现嵌套是个不错的东西,所以特地记下来:首先,在C语言的宏中是容许嵌套的,其嵌套后,一般的展开规律像函数的参数一样,先展开参数,在分析函数,所以展开顺序是由内而外,但是当宏中有#则不再展开参数了,如果宏中有##,则先展开函数,再展开里面的参数。
如下面的例子:
#include <stdio.h>#define TO_STRING2( x ) #x#define TO_STRING( x ) TO_STRING1( x )#define TO_STRING1( x ) #x#define PARAM( x ) #x#define ADDPARAM( x ) INT_##xint main(){ const char * str = TO_STRING(PARAM( ADDPARAM( 1 ) ) ); printf("%s\n",str); str = TO_STRING2(PARAM( ADDPARAM( 1 ) ) ); printf("%s\n",str); return 1;
}它的输出结果为:
“ADDPARAM( 1 )”
PARAM( ADDPARAM( 1 ) )
对于宏TO_STRING,它的定义中没有#,所以先展开里面的“PARAM( ADDPARAM( 1 ) )”,由于PARAM中有#,所以里面展开的结果为ADDPARAM( 1 ),然后外面再展开,其结果为”ADDPARAM( 1 )”
而对于TO_STRING2,其定义中有#,所以直接展开,其结果为PARAM( ADDPARAM( 1 ) )
而对于下面的例子:
#include <stdio.h>#define TO_STRING2( x ) a_##x#define TO_STRING( x ) TO_STRING1( x )#define TO_STRING1( x ) #x#define PARAM( x ) #x#define ADDPARAM( x ) INT_##x
int main()
{
str = TO_STRING(TO_STRING2(PARAM( ADDPARAM( 1 ) ) ));
printf(“%s\n”,str);
return 1;
}
其输出结果为:
a_PARAM( INT_1 )
因为首先分析TO_STRING的参数TO_STRING2(PARAM( ADDPARAM( 1 ) ) ),而对于TO_STRING2(x),由于其定义中有##,所以先展开该函数,其结果为a_PARAM(ADDPARAM( 1 )),而ADDPARAM( 1 )展开,结果为INT_1,所以其总结果为a_PARAM( INT_1 )
转载http://zhangzhibiao02005.blog.163.com/blog/static/37367820201182585935895/
- C语言宏嵌套问题
- C语言嵌套注释问题
- 一个简单的C语言嵌套问题
- C语言函数嵌套定义问题
- C语言下宏的嵌套运用
- C语言嵌套注释
- C 语言 嵌套 汇编
- C语言递归嵌套
- 浅谈C语言的优先级、符号以及嵌套问题
- c:foreach 嵌套问题
- C语言循环的嵌套
- C语言调用嵌套汇编
- C语言--printf的嵌套
- c语言中的函数嵌套
- C语言:循环的嵌套
- c语言list嵌套遍历
- C语言注释嵌套的解决办法
- 单片机编程C语言 好多for嵌套
- 一些常用的JS方法
- 【Objective-C 】音频 API 一览
- 保存图片至相册
- JQuery Proxy()函数的理解
- iOS播放声音
- C语言宏嵌套问题
- mysql预编译处理(mysqli、PDO)
- iOS——由app跳转到AppStore下载app或者调转到某一个网页
- 跳转界面的几种方法
- Web关于图片上传,缩略图及加水印,还有一些常用的方法
- 个人项目资源下载
- IOS 9 将删除Apps以节省空间供系统升级
- Leetcode--easy系列5
- java join用法