Boost logo

Boost Users :

Subject: Re: [Boost-users] [wave] Tracing a macro in a preprocessor directive
From: Paul Mensonides (pmenso57_at_[hidden])
Date: 2011-08-30 05:12:09


On Mon, 29 Aug 2011 15:27:43 -0400, Edward Diener wrote:

> I was trying to trace the output of a macro within a preprocessor
> directive in a file using the Wave trace facility. The directive is:
>
> #elif BOOST_PP_ITERATION_FLAGS() == 1
>
> so I specified:
>
> #pragma wave trace(enable)
> #elif BOOST_PP_ITERATION_FLAGS() == 1 #pragma wave trace(disable)
>
> But wave's trace showed me an empty file where the macro output (
> -tsomefile ) should have been.
>
> Is there a way to capture the output of the BOOST_PP_ITERATION_FLAGS()
> macro at the point where the #elif is occuring using Wave's trace
> facility ?

If this is from the curryable.hpp file, gcc does attempt to parse all of
the #if/#elif directives for the level it is currently on. E.g.

#if !BOOST_PP_IS_ITERATING // okay, will "decay" to 0 if not defined

// ...

#elif BOOST_PP_ITERATION_FLAGS() == 2 // will cause error
   // when not iterating, iteration flags is not defined
   // so this will result in 0() == 2 which is a syntax error

// ...

#endif

The "problem" is that gcc requires a well-formed expression even if the
first branch of #if is taken. The fix is to do this:

#if !BOOST_PP_IS_ITERATING

// ...

#else

    #if BOOST_PP_ITERATION_FLAGS() == 2

        // ...

    #endif

#endif


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