do-while-zero 结构在宏定义中的应用

本文介绍了在C语言宏定义中使用do-while(0)结构来避免语法错误和混淆的问题。通过示例展示了不使用此结构可能会导致的错误,并解释了MISRA C-2004规则中对此结构的认可,强调了其在封装多条语句宏中的重要性。
摘要由CSDN通过智能技术生成

do while 语句在使用宏定义时是一个有用的技巧,说明如下:
假设有这样一个宏定义

#define macro(condition) /
if(condition) dosomething()

现在在程序中这样使用这个宏:

if(temp)
    macro(i);
else
    doanotherthing();

一切看起来很正常,但是仔细想想。这个宏会展开成:

if(temp)
    if(condition) dosomething();
else
    doanotherthing();

这时的else不是与第一个if语句匹配,而是错误的与第二个if语句进行了匹配,编译通过了,但是运行的结果一定是错误的。
为了避免这个错误,我们使用do{….}while(0) 把它包裹起来,成为一个独立的语法单元,从而不会与上下文发生混淆。同时因为绝大多数的编译器都能够识别do{…}while(0)这种无用的循环并进行优化,所以使用这种方法也不会导致程序的性能降低。


因为在C语言中对宏是不进行语法检查的,所以在替换时有可能产生一些隐蔽的错误,上面举出了一例,再举一例:

#define INTI_RECT_VALUE( a, b )\
    a = 0;\
    b = 0;

使用宏时,

for (index = 0; index <

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值