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) )
  
参考书籍: <<代码阅读方法与实践>>

相关内容