基于C中含有if的宏定义详解
基于C中含有if的宏定义详解
发布时间:2016-12-28 来源:查字典编辑
摘要:含有if的宏定义当宏定义中含有if时1)定义如下宏#defineDC(p)if(foo(p))fun(p)用在下面的环境中if(k>n)DC...

含有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) )

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

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新C语言学习
热门C语言学习
编程开发子分类