On 01/21/2014 04:20 PM, pmenso57@comcast.net wrote:
Eric, just be very careful about what macros expand when. E.g. the expression:
!defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
will get expanded on the first preprocessor pass to something like
!defined(1)
(or whatever it expands to)
Thanks for the warning, and that makes sense, but it's not what I'm seeing. I'm seeing wave spit out:
# if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
instead of:
# if !defined(1)
Why would that be? Regardless, I can turn off expansion of this macro during preprocessing with wave's -N switch, so there's a fix should I ever need it.
Turning off the expansion of macros used in #if conditions can cause all kind of trouble. All depends on what is inside the wave pragmas:
// this stuff will be seen by wave but not generated
#pragma wave option(output:file) // this stuff will be preprocessed and written to 'file' #pragma wave option(output:null)
// this stuff will be seen by wave but not generated
So if it gets expanded outside of the pragma region all is fine. Did I misunderstand something?
The code is getting expanded *in* the pragma region, but I think I can guess what's happening. I have this:
#define FUSION_HASH # #if defined(__WAVE__) && \ defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES) FUSION_HASH if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) #endif #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) || \ (defined(__WAVE__) && \ defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)) vector(vector&& rhs) : vec(std::forward
(rhs.vec)) {} // more code that uses rvalue references #endif #if defined(__WAVE__) && \ defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES) FUSION_HASH endif #endif #undef FUSION_HASH When wave is preprocessing the files, it spits out:
# if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) vector(vector&& rhs) : vec(std::forward
(rhs.vec)) {} #endif as it should. That's because BOOST_NO_CXX11_RVALUE_REFERENCES is not defined, and because it doesn't get replaced with 0, which would only happen if wave thought it was evaluating a #if ... which it's not.
This begs the question of which compiler config wave uses. Does it try to emulate a known compiler? If so, which? And what version? It's never occurred to me before to wonder what #defines are set when wave processes #include
.
I predefines only the wave-specific macros (http://www.boost.org/doc/libs/1_55_0/libs/wave/doc/predefined_macros.html). Everything else has to be supplied by you. Regards Hartmut --------------- http://boost-spirit.com http://stellar.cct.lsu.edu