• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C语言宏展开

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

参考自:

https://blog.csdn.net/buye1986/article/details/45100339

 

c语言宏展开

①一个较长的宏定义可以分成若干行,这需要在待续的行末尾加上一个反斜杠符”\”

#define TUP_ASSERT(__expression) do {\

        if (!( __expression )) \

        { \

            SYSLOG_LEGACY(EAaSysLogSeverityLevel_Error,"<TUP ASSERTION FAILED> (%s) file: %s line:%u", #__expression,__FILE__, __LINE__); \

            AaErrorAssertion(#__expression,__FILE__, __LINE__); \

        } \

} while(0)

②在替换文本中,参数名以#作为前缀则结果将被扩展为由实际参数替换该参数的带引号的字符串

#define dprint(expr) printf(#expr “ =%g\n”, expr)

使用语句dprint(x/y),该宏将被扩展为  printf(“x/y” “= %g\n”, x/y);

③预处理运算符##为宏展开提供参数连接的作用

#define paste(front, back) front ##back

宏调用paste(name,1)的结果为 name1

④宏展开顺序大致可以归结为:

有点类似于函数调用的顺序

1 先外层展开一次, 用实参代替形参,将实参代入宏文本中

2 然后实参宏展开

3 实参展开结束, 返回外层是否还有宏定义需要展开, 是, 则继续展开

如果在第2步,实参代入宏文本后,实参之前或之后遇到###,实参不再展开

例1:

#define cat(a,b) a ## b

宏调用:cat(cat(1, 2), 3) 的展开顺序为:

cat(cat(1, 2), 3) -->cat(1, 2) ## 3  -->cat(1, 2)3

cat(1,2)仍是宏,但后面是##,不再展开,结果为:cat(1, 2)3

例2:

#definecat(a,b) a ## b

#definexcat(x, y) cat(x, y)

宏调用 xcat(xcat(1, 2), 3) 的展开顺序为:

xcat(xcat(1,2), 3) -->cat(xcat(1, 2), 3) -->cat(cat(1, 2), 3) -->cat(1 ## 2, 3) --> 1 ##2 ## 3 -->123

务必注意参数的处理顺序,第二步在第三步前面执行,第一层宏展开后,实参是宏,则首先处理实参的宏展开,即使宏替换后本身也是宏。在例2中,虽然也生成的cat(cat(1, 2), 3),但是是首先执行里面的cat(1, 2), 所以结果不一样。例2中以下顺序是错的:

xcat(xcat(1,2), 3) --> cat(xcat(1, 2), 3) --> xcat(1, 2) ## 3 -->xcat(1, 2)3

 

在Linux测试结果:

使用gcc –E 编译可以只做预处理:源文件hepeng.c:

*****************************************************************************

#define cat(a,b) a ## b

#define xcat(x,y) cat(x,y)

int  main()

{

   cat(cat(1,2),3);

   xcat(xcat(1,2),3);

   xcat(cat(1,2),3);

    return 0;

}

*****************************************************************************

[penhe@hzling23 program]$gcc -E hepeng.c |more

*****************************************************************************

# 1 "hepeng1.c"

# 1 "<built-in>"

# 1 "<command line>"

# 1 "hepeng1.c"

int main()

{

    cat(1,2)3;

    123;

    123;

    return 0;

}

*****************************************************************************

 

vs应该也有类似的命令, 不过我发现网上有其他简单的方法,

https://blog.csdn.net/qyee16/article/details/9322281 所示

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C# 抓取页面(带认证) 转发布时间:2022-07-13
下一篇:
QuartzC#使用发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap