内容: 今天记录一下多语句宏可能会引发的不好发现的问题。有时候定义这个宏的目的,是为了方便替换,但是在有些场合却会带来不正确的结果。
代码:
代码中定义了一个用于异常处理的宏,当所需要的变量为负数的时候,就打印异常后退出。来看看执行结果吧!
结果:能达到我们的目的,当我们给i赋值-1的时候,能够正常发挥宏的作用,打印异常后退出。
那么当我们给i赋值一个正数的时候,是什么情况呢?
结果:
分析:函数提前退出了,连同后面的打印positive信息也没有执行,那么是为什么呢?因为宏的替换编译器是不会去帮我们检查上下文的,看到就替换,不管你什么情况,也没有类型检查。也就是说文中的宏定义的第一句虽然不符合条件,不会执行,但是宏的第二句语句一句不属于if的那个块了,属于执行流必执行的语句。所以无论正数负数,exit(1)都一定会执行,因此出现图中的情况。
建议:使用多语句宏一定要明确好使用地方,尽可能不要定义多语句宏。那么如果定义多语句宏,加个括号不就可以解决上述问题了吗,其实可以解决,但是会引发另外的问题,我们应该使用其他方法来代替使用宏,详细见下一篇。今天下午还有课,写完准备睡觉咯!
大三学生一枚,文章均非抄袭或者模仿,均为原创,仅代表个人观点,如果文章有错误的地方,欢迎在下方提出,每条评论我都会去认真看并回复,同时感谢指正的前辈。