C C++最新嵌入式 C 语言宏嵌套的展开规则_宏定义嵌套##(2),被逼无奈开始狂啃底层技术

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取




1、在宏定义中,将参数加上括号,这样在替换时保证括号内的表达式优先运算。2、利用括号将整个宏定义的内容括起来,保证整个宏定义中的表达式优先运算。宏嵌套是宏使用的难点,也是易错点。下面我将宏嵌套的展开规则用流程图来说明一下:


![图片](https://img-blog.csdnimg.cn/img_convert/23309189615671d3bd62fd730a15b48d.jpeg)


宏嵌套的展开规则流程图


注意:上图中的 2 和 3 是条件或,只要满足一个条件就会进入流程5。下面举例说明:



// example 1
#include #define TO_STRING2(x) #x
#define TO_STRING1(x) #x
#define TO_STRING(x) TO_STRING1(x)

#define PARAM(x) #x
#define ADDPARAM(x) INT_##x

int main()
{
const char *str = TO_STRING(PARAM(ADDPARAM(1)));
printf(“%s\n”,str); //输出: “ADDPARAM(1)”

str = TO_STRING2(PARAM(ADDPARAM(1)));
printf(“%s\n”,str); //输出: PARAM(ADDPARAM(1))

return 0;
}


**上例中两个嵌套宏的展开流程如下:**



TO_STRING(PARAM(ADDPARAM(1)))

-> 展开 PARAM:TO_STRING(“ADDPARAM(1)”)

-> 展开 TO_STRING:TO_STRING1(“ADDPARAM(1)”)

-> 展开 TO_STRING1:““ADDPARAM(1)””

TO_STRING2(PARAM(ADDPARAM(1)))

-> 展开 TO_STRING2:“PARAM(ADDPARAM(1))”



// example 2
#include #define TO_STRING2(x) a_##x
#define TO_STRING1(x) #x
#define TO_STRING(x) TO_STRING1(x)

#define PARAM(x) #x
#define ADDPARAM(x) INT_##x

int main()
{
const char *str = TO_STRING(TO_STRING2(PARAM(ADDPARAM(1))));
printf(“%s\n”,str); //输出: a_PARAM(INT_1)
return 0;
}


**上例中嵌套宏的展开流程如下:**



TO_STRING(TO_STRING2(PARAM(ADDPARAM(1))))

-> 展开 TO_STRING2:TO_STRING(a_PARAM(ADDPARAM(1))) //注意此次展开后,PARAM宏名被破坏了,变成了a_PARAM不再是有效的宏名了

-> 展开 ADDPARAM:TO_STRING(a_PARAM(INT_1))

-> 展开 TO_STRING:TO_STRING1(a_PARAM(INT_1))

-> 展开 TO_STRING1:“a_PARAM(INT_1)”


注意:嵌套宏的展开规则与编译器有关,不同的编译器可能对同一个嵌套宏展开不同。以上测试都是在 VS2010(x86)上。




![img](https://img-blog.csdnimg.cn/img_convert/0a679a1585485b2cc106d6641aba1628.png)
![img](https://img-blog.csdnimg.cn/img_convert/4dbc0e043a1ab9e69df0150200d31dcb.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

s/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 22
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值