调试宏定义

调试宏定义的方法:
1:通过gcc -E 产生预编译后的源代码,所有的预编译动作都已完成,如头文件的插入,宏定义的展开
example:
  1. #include <</span>stdlib.h>
  2. #include <</span>stdio.h>
  3. #define MACRO1(x) (++(x))
  4. #define MACRO2(x) (MACRO1(x)+100)
  5. #define MACRO3(x) (MACRO2(x)+200)
  6. int main(void)
  7. {
  8. int = 0;
  9. int = 0;
  10.     = MACRO3(a);
  11.     printf("%d\n", b);
  12.     return0;
  13. }

这里的MACRO3嵌套调用了MACRO2,MACRO1。使用gcc-E test.c > test.e,得到预编译后的代码:

  1. /*
  2. 前面是1800+行的头文件代码,此处省略 
  3. */
  4. int main(void)
  5. {
  6. int = 0;
  7. int = 0;
  8.     = (((++(a))+100)+200);
  9.     printf("%d\n", b);
  10.     return0;
  11. }
这里可以清晰的看到b =(((++(a))+100)+200);这个就比刚才的宏定义要清楚的多。 但是从这个例子也可以看到这个方法的局限性。
1. 由于预编译处理会执行所有的预处理代码,包括头文件的插入,这导致最后的代码行数太多
2. 得到的了一个新的代码文件。这样的话,在大型工程中,如果需要调试多个文件中的宏定义,需要我们一个一个的预编译,太麻烦了。

2:使用gcc的-g3选项。-g是为了调试程序,它将调试信息加入到最后的二进制可执行文件中。当不指定级别的时候,level为2,为了调试宏定义,使用level 3,即g3。然后gdb调试的过程中使用macro expand/exp 来展开宏定义。比如:
  1. (gdb) macro exp MACRO3(3)
  2. expands to: (((++(3))+100)+200)
from http://blog.chinaunix.net/uid-29062294-id-4255572.html



本文转自:http://blog.sina.com.cn/s/blog_605f5b4f0101ey1p.html 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值