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/

0 1
原创粉丝点击