酒鬼z

我自将心向明月,独卧沙场醉圆缺

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

查看宏展开 (转)

转自:http://blog.csdn.net/zerolxl/article/details/8001814

 

1.     怎么查看宏展开

         从一个宏定义开始说起

#define Mul( a,b) a * b

      乍看之下这个宏定义并没有什么问题,但是当你采用如下用法的时候就会出现问题了

  1. int main(char * argv[] ,intargc)  
  2.   
  3. {  
  4.   
  5.        intnmul=Mul(2+3, 4+5);  
  6.   
  7.        printf("mul=[%d]\n",nmul);  
  8.   
  9.        return 0;  
  10.   
  11. }  

运行后输出:


 

     可以看到结果并不是我们预期的 5*9 =45, 这个时候我们可能就会想到怎么去查看宏展开后是变成怎样的代码呢?

在vs2008 或者vs2010 中我们可以选择属性 –》预编译选项–》编译文件选择产生文件,如下所示:

我们会在debug文件夹下看到对应的源文件名称后缀为.i的文件产生,将他打开,跳转到main函数里面,我们将看到 main函数变成了:

  1. <span style="font-size:18px;"int main(char * argv[] ,int argc)   
  2. {  
  3.      int nmul=2+3 * 4+5;  
  4.      printf("mul=[%d]\n",nmul);  
  5.      getchar();  
  6.       return0;   
  7. }</span>  

由此我们可以很清楚的看到为什么结果会是19了(先乘除后加减)12+7=19.。。

 

当然从这个例子中我们也要注意到一个宏定义的小技巧,或者可以视为一种小规范吧,那就是参数最好都用括号括起来,防止产生优先级的问题

如果我们将MUL定义为

#define Mul( a,b)( a) * (b)

那么展开后就会是:

  1. <span style="font-size:18px;">int main(char * argv[] ,int argc)  
  2. {  
  3.          int nmul= (2+3) *  (4+5);   
  4.          printf("mul=[%d]\n",nmul);  
  5.          getchar();  
  6.          return 0;  
  7. }  
  8.  </span>  


输出就为45 了


    

Linux 下的话可在 编译选项里加上 –E  -o 输出的文件名 也可以达到一样的效果:

如:

 

g++ -c define.cpp –E –o define.i

我们就可以在define.i 看到相同的信息了


posted on 2013-11-25 09:45  酒鬼z  阅读(597)  评论(0)    收藏  举报