How to debug macro?

Discussion in 'C++' started by Peng Yu, Jun 29, 2008.

  1. Peng Yu

    Peng Yu Guest

    Hi,

    It is benifitical to use macro in certain cases.

    http://www.boost.org/doc/libs/1_35_0/libs/preprocessor/doc/index.html

    However, I found that it is not easy to debug a macro. For example,
    for the following program, I can not trace into the last macro in gdb.

    In this sense, if I want to debug the code easily, should I avoid
    using macros. Are there any better way to debug macros?

    Thanks,
    Peng

    $ cat main.cc
    #include <boost/typeof/typeof.hpp>
    #include <iostream>

    #define MACRO_DEF \
    class A { \
    public: \
    A(int a) : _a(a) { } \
    int the_a() const { return _a; } \
    private: \
    int _a; \
    };

    MACRO_DEF

    #define MACRO \
    A a(1);\
    std::cout << a.the_a() << std::endl;

    int main() {
    MACRO
    }


    $gdb main-g.exe
    GNU gdb 6.4.90-debian
    Copyright (C) 2006 Free Software Foundation, Inc.
    GDB is free software, covered by the GNU General Public License, and
    you are
    welcome to change it and/or distribute copies of it under certain
    conditions.
    Type "show copying" to see the conditions.
    There is absolutely no warranty for GDB. Type "show warranty" for
    details.
    This GDB was configured as "x86_64-linux-gnu"...Using host
    libthread_db library "/lib/libthread_db.so.1".

    (gdb) start
    Breakpoint 1 at 0x40081c: file main.cc, line 20.
    main () at main.cc:20
    20 MACRO
    (gdb) s
    A (this=0x7fffb8f0de80, a=1) at main.cc:13
    13 MACRO_DEF
    (gdb) s
    A::the_a (this=0x7fffb8f0de80) at main.cc:13
    13 MACRO_DEF
    (gdb) s
    1
    main () at main.cc:21
    21 }
    (gdb) n
    0x00002afcf215b4ca in __libc_start_main () from /lib/libc.so.6
    (gdb) n
    Single stepping until exit from function __libc_start_main,
    which has no line number information.

    Program exited normally.
    (gdb)
     
    Peng Yu, Jun 29, 2008
    #1
    1. Advertising

  2. Peng Yu

    Ian Collins Guest

    Peng Yu wrote:
    > Hi,
    >
    > It is benifitical to use macro in certain cases.
    >
    > http://www.boost.org/doc/libs/1_35_0/libs/preprocessor/doc/index.html
    >
    > However, I found that it is not easy to debug a macro.
    >

    Which is why they are best avoided. With the exception of passing file
    name and line number to debug logs, I don't think I've used a macro in
    C++ in the past decade.

    --
    Ian Collins.
     
    Ian Collins, Jun 29, 2008
    #2
    1. Advertising

  3. Peng Yu

    Kai-Uwe Bux Guest

    Peng Yu wrote:

    > Hi,
    >
    > It is benifitical to use macro in certain cases.
    >
    > http://www.boost.org/doc/libs/1_35_0/libs/preprocessor/doc/index.html
    >
    > However, I found that it is not easy to debug a macro. For example,
    > for the following program, I can not trace into the last macro in gdb.
    >
    > In this sense, if I want to debug the code easily, should I avoid
    > using macros. Are there any better way to debug macros?


    Look at the output of the preprocessor. I think most compilers allow you to
    do that. This way, you can see what the macro expands to.


    Best

    Kai-Uwe Bux
     
    Kai-Uwe Bux, Jun 29, 2008
    #3
  4. Peng Yu

    Phlip Guest

    > It is benifitical to use macro in certain cases.

    Use macros for...

    - conditional compilation
    - token pasting
    - stringerization

    but, naturally, try to avoid _those_ things unless the alternatives are
    worse.
     
    Phlip, Jun 29, 2008
    #4
  5. Peng Yu

    Greg Herlihy Guest

    On Jun 28, 9:23 pm, Peng Yu <> wrote:

    > It is benifitical to use macro in certain cases.


    Perhaps, but the example below certainly isn't one of them.

    >
    > #define MACRO_DEF \
    > class A { \
    > public: \
    > A(int a) : _a(a) { } \
    > int the_a() const { return _a; } \
    > private: \
    > int _a; \
    > };
    >
    > MACRO_DEF
    >
    > #define MACRO \
    > A a(1);\
    > std::cout << a.the_a() << std::endl;


    > However, I found that it is not easy to debug a macro. For example,
    > for the following program, I can not trace into the last macro in gdb.


    If you (who wrote the macro) have trouble debugging it, imagine the
    difficulties that the maintenance programmer will face - simply to
    understand what the macro is supposed to do. After all, what would you
    think if you had to debug a C++ program whose main() function looked
    like the main() in your program:

    > int main() {
    >   MACRO
    >
    > }


    Having to deal with code like this, in my experience, would be enough
    to convince most programmers that they really should be working -
    somewhere else.

    Greg
     
    Greg Herlihy, Jun 30, 2008
    #5
  6. Peng Yu

    Peng Yu Guest

    On Jun 30, 12:51 am, Greg Herlihy <> wrote:
    > On Jun 28, 9:23 pm, Peng Yu <> wrote:
    >
    > > It is benifitical to use macro in certain cases.

    >
    > Perhaps, but the example below certainly isn't one of them.
    >
    >
    >
    >
    >
    > > #define MACRO_DEF \
    > > class A { \
    > > public: \
    > > A(int a) : _a(a) { } \
    > > int the_a() const { return _a; } \
    > > private: \
    > > int _a; \
    > > };

    >
    > > MACRO_DEF

    >
    > > #define MACRO \
    > > A a(1);\
    > > std::cout << a.the_a() << std::endl;
    > > However, I found that it is not easy to debug a macro. For example,
    > > for the following program, I can not trace into the last macro in gdb.

    >
    > If you (who wrote the macro) have trouble debugging it, imagine the
    > difficulties that the maintenance programmer will face - simply to
    > understand what the macro is supposed to do. After all, what would you
    > think if you had to debug a C++ program whose main() function looked
    > like the main() in your program:
    >
    > > int main() {
    > > MACRO

    >
    > > }

    >
    > Having to deal with code like this, in my experience, would be enough
    > to convince most programmers that they really should be working -
    > somewhere else.


    Hi Greg,

    I guest you misunderstood my OP. I have never said that my example is
    the case that I should use macro.

    I just raised that example to show the difficulty of debugging it. It
    is not at all similar to the real code that I'm pondering whether I
    should use macro or not.

    I originally considered macro because there are somewhat redundancies
    (not exactly the same) in that code that can not be refactored in with
    extract method, etc. However, as macro is hard to debug, I end up with
    writing a code generator to generated the somewhat redundant code.

    Thanks,
    Peng
     
    Peng Yu, Jun 30, 2008
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Dead RAM
    Replies:
    20
    Views:
    1,174
    John Harrison
    Jul 14, 2004
  2. D Senthil Kumar

    macro name from macro?

    D Senthil Kumar, Sep 20, 2003, in forum: C Programming
    Replies:
    1
    Views:
    608
    Jack Klein
    Sep 21, 2003
  3. sounak

    to get macro name from macro value

    sounak, Nov 22, 2005, in forum: C Programming
    Replies:
    17
    Views:
    526
    Mark McIntyre
    Nov 22, 2005
  4. Patrick Kowalzick
    Replies:
    5
    Views:
    511
    Patrick Kowalzick
    Mar 14, 2006
  5. Mike Manilone

    macro inside macro

    Mike Manilone, Oct 3, 2011, in forum: C Programming
    Replies:
    8
    Views:
    491
    Mike Manilone
    Oct 6, 2011
Loading...

Share This Page