运维开发网

基于C中含有if的宏定义详解

运维开发网 https://www.qedev.com 2020-02-13 10:27 出处:网络 作者: 网络整理
本篇文章是对C中含有if的宏定义进行了详细的分析介绍,需要的朋友参考下
含有if的宏定义

当宏定义中含有 if 时

1) 定义如下宏

#define DC(p) if( foo(p) )fun(p)

用在下面的环境中

if(k>n)

DC(k);

else

DC(n);

宏替换后,如下

if(k>n)

if( foo(k) )

fun(k);

else

if( foo(n) )

fun( n );

可见, 原来的 if 和 else 不再配对.

2) 为了避免这类问题, 我们可以将包含if语句的宏定义为一个整体.

#define DC(p) {if( foo(p) ) fun(p);}

但是, 替换后变为

if(k>n)

{

if( foo(k) )

fun(k);

};else ...

由于else前面多了个分号, 编译时会提示错误没有与else配对的if.

3)因为这些原因, 在宏定义中, 经常会将语句序列放入 do{...}while(0)块中.

如下

#define DC(p) do{( if( foo(p) ) fun(p); }while(0)

替换后

if(k>n)

do

{

if( foo(k) )

fun(k);

}while(0);

else

...

程序可以正常运行

4)替换方案

a)采用 ? : 表达式

#define DC(p) ( (foo(p)) ? (fun(p)):0)

b)利用布尔运算的短路径求值属性

#define DC(p) ( (foo(p)) && (fun(p), 1) )

参考书籍: <<代码阅读方法与实践>>

0

精彩评论

暂无评论...
验证码 换一张
取 消