手机
当前位置:查字典教程网 >编程开发 >C语言 >基于C中含有if的宏定义详解
基于C中含有if的宏定义详解
摘要:含有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中含有if的宏定义详解】相关文章:

c语言中 基于随机函数的使用详解

基于c++强制类型转换的(总结)详解

基于linux下获取时间函数的详解

基于C++ list中erase与remove函数的使用详解

基于C语言sprintf函数的深入理解

基于atoi()与itoa()函数的内部实现方法详解

基于C++中sprintf的错误总结详解

基于C语言中段错误的问题详解

深入C++可见性与生命期的区别详解

基于C/C++ 常见误区详解

精品推荐
分类导航