This macro is useful when a delay is necessary to produce the correct semantics of a macro invocation.
For example, when a macro expands to an argument list to another macro.
This macro will expand the the argument list on the first pass, and then rescan to expand any more macros.
#include <boost/preprocessor/control/if.hpp>
#include <boost/preprocessor/facilities/expand.hpp>
#define MACRO(a, b, c) (a)(b)(c)
#define ARGS() (1, 2, 3)
BOOST_PP_EXPAND(MACRO ARGS) // expands to (1)(2)(3)
#define SAMPLE(n) \
BOOST_PP_EXPAND( \
MACRO, \
BOOST_PP_IF( \
n, \
(x, y, z), \
(a, b, c) \
) \
) \
/**/
SAMPLE(0) // expands to (a)(b)(c)
SAMPLE(1) // expands to (x)(y)(z)