查看C语言宏函数(预处理/gdb)

来源:互联网 发布:微信js安全域名设置 编辑:程序博客网 时间:2024/06/04 18:54

                                                                             查看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!