Boost logo

Boost Users :

From: John Femiani (JOHN.FEMIANI_at_[hidden])
Date: 2008-05-08 06:24:56


Sergey wrote:
> JF> #define FOO_MACRO(S) BOOST_PP_CAT(BAR_MACRO_,
> JF> BOOST_PP_SEQ_HEAD(S))(S)
>
> JF> That looks more straightforward to me.
> Thanks a lot! It's much better! :)
>
>

One thing I do know about the preprocessor library is that recursion is
not allowed.
You can tell that Boost.Preprocessor is using BOOST_PP_CAT internally
because it
shows up in the preprocessed results (this happened to me before).
That behavior is documented at
http://www.boost.org/doc/libs/1_35_0/libs/preprocessor/doc/index.html

I did a little search and I think your culprit is in
boost\preprocessor\seq\enum.hpp:28:

# define BOOST_PP_SEQ_ENUM(seq) BOOST_PP_CAT(BOOST_PP_SEQ_ENUM_,
BOOST_PP_SEQ_SIZE(seq)) seq
                                    

Since PP_CAT in the first version expanded to BAR_MACRO_1(S), the
preprocessor expanded it which invokes PP_CAT again.
By putting the sequence outside of the PP_CAT macro, it just expanded
to BAR_MACRO_1 -- no parenthesis -- and therefor it was not expanded
inside PP_CAT macro, and we were safe.

Since your own macro was not PP_CAT, there was no recursion in yours and
apparently everything worked.

At least I think that is what happened :)

-- John


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net