调试宏定义的方法:
1:通过gcc -E 产生预编译后的源代码,所有的预编译动作都已完成,如头文件的插入,宏定义的展开
example:
- #include
<</span>stdlib.h> - #include
<</span>stdio.h> - #define MACRO1(x)
(++(x)) - #define MACRO2(x)
(MACRO1(x)+100) - #define MACRO3(x)
(MACRO2(x)+200) - int
main(void) - {
- int
a = 0; - int
b = 0; -
b = MACRO3(a); -
printf("%d\n", b); -
return0; - }
这里的MACRO3嵌套调用了MACRO2,MACRO1。使用gcc-E test.c > test.e,得到预编译后的代码:
- /*
- 前面是1800+行的头文件代码,此处省略
- */
- int
main(void) - {
- int
a = 0; - int
b = 0; -
b = (((++(a))+100)+200); -
printf("%d\n", b); -
return0; - }
这里可以清晰的看到b =(((++(a))+100)+200);这个就比刚才的宏定义要清楚的多。
但是从这个例子也可以看到这个方法的局限性。
1. 由于预编译处理会执行所有的预处理代码,包括头文件的插入,这导致最后的代码行数太多。
2. 得到的了一个新的代码文件。这样的话,在大型工程中,如果需要调试多个文件中的宏定义,需要我们一个一个的预编译,太麻烦了。
2:使用gcc的-g3选项。-g是为了调试程序,它将调试信息加入到最后的二进制可执行文件中。当不指定级别的时候,level为2,为了调试宏定义,使用level 3,即g3。然后gdb调试的过程中使用macro expand/exp 来展开宏定义。比如:
- (gdb)
macro exp MACRO3(3) - expands
to: (((++(3))+100)+200)
from http://blog.chinaunix.net/uid-29062294-id-4255572.html 本文转自:http://blog.sina.com.cn/s/blog_605f5b4f0101ey1p.html