查看C语言宏函数(预处理/gdb调试阶段)
edit by pinyue 2012.2.17 night
当我们编写完C源程序后很想看一看自己写的宏展开后是否正确,此文就讨论一下目前所接触的查看宏的方法:
1~ 预处理阶段$ gcc -E 源代码.c -o 源代码.i
$ vim 源代码.i //打开生成的.i文件,翻到最后即可看到自己编写的宏的展开
2~ 调试阶段
调试阶段即通过gdb调试器查看宏的展开。
$ gcc -gdwarf-2 -g3 源代码.c -o 源代码名
编译阶段加上参数“-gdwarf-2 -g3”,具体大家可以参见一下man gcc,“-o 源代码名”可以不写,不写生成的文件为a.out。
$ gdb 源代码名(或者a.out)
(gdb) macro expand 宏定义体
eg. 我们先看第1~种方法:
#include <stdio.h>
#define DOUBLE 1.23456
int main(void)
{
double d;
d = DOUBLE;
printf("%lf\n", d);
return 0;
}
上面的代码非常简单,大家一看就明白了……我们看一下预处理后的结果:
int main(void)
{
double d;
d = 1.23456;
printf("%lf\n", d);
return 0;
}
d = 1.23456;可以看到DOUBLE在这里展开了
我们再来看第2~种方法:
下面为*.h中的部分代码:
#define random_char() (rand() % 26 + 'a')
#define random_float() (rand() % 100 / 10.0)
#define FILL(array, sz, type) \
if (strcmp(type, "char") == 0) \
for (i = 0; i < sz; ++i) \
array[i] = random_char(); \
else \
for (i = 0; i < sz; ++i) \
array[i] = random_float()
在*.c中我们的调用语句如下:
FILL(a, M, "char");
编译命令如上,然后进入调试命令行:
(gdb) macro expand FILL(a, M, "char")
expands to: if (strcmp("char", "char") == 0) for (i = 0; i < 32; ++i) a[i] = (rand() % 26 + 'a'); else for (i = 0; i < 32; ++i) a[i] = (rand() % 100 / 10.0)
(gdb) macro expand random_float()
expands to: (rand() % 100 / 10.0)
note:宏定义一定要写完整,否则不会显示展开结果的!比如下面这样:
(gdb) macro expand FILL
expands to: FILL
(gdb) macro expand random_float
expands to: random_float
好了,看到以上的结果,以后调试程序会很方便吧!辛苦了好久才搞定的,大家如果有好的方法要多多分享哦^_^
No pains, no gains!