Tanton Gibbs wrote:
Also, I was asked by a coworker if the following would be std C++:
BOOST_PP_LIST_FOR_EACH( DO_IT, BOOST_PP_EMPTY(), ARG_LIST )
I said that it would not because BOOST_PP_EMPTY would be expanded first to nothing, which would be the same as BOOST_PP_LIST_FOR_EACH( DO_IT, , ARG_LIST ) which Paul explicitly said below was non-conformant.
Is this correct?
Well, not exactly, but close. This, for example, is okay: #define EMPTY() #define MACRO(x) x MACRO( ) // undefined MACRO( EMPTY() ) // okay However, this is not: #define MACRO_2(x) MACRO(x) MACRO_2( EMPTY() ) // okay for MACRO_2, undefined for MACRO The reason is relatively simple. Before the argument is inserted into the replacement list of MACRO_2, it is macro expanded. In this case, it expands to nothing, which yields a replacement list like this: MACRO( ) Which is rescanned for macros to expand and consequently introduces undefined behavior. BOOST_PP_LIST_FOR_EACH, as well as virtually every other pp-lib primitive uses other macros, so it is never safe to do this: BOOST_PP_SOME_MACRO( BOOST_PP_EMPTY() ) C99 explicitly allows you to pass nothing as macro argument, but it is still undefined in C++. Regards, Paul Mensonides