I’ve reduced my problem to the following code snippet which compiles fine on GCC, but which fails to compile on MSVC (versions 9 and 10). The error provided by MSVC is “fatal error C1012: unmatched parenthesis : missing ')'”. It seems to have to do with the BOOST_PP_ITERATION_FLAGS() directive. I’m using Boost 1.45.0.
Any thoughts on workarounds or bug-fixes?
Thanks,
Rob Rumpf
#if !BOOST_PP_IS_ITERATING
# ifndef __FILE_HPP__
# define __FILE_HPP__
# include <boost/preprocessor/iteration/iterate.hpp>
# include <boost/preprocessor/seq/size.hpp>
# include <boost/preprocessor/arithmetic/dec.hpp>
/// Set up the first (most outer) nested FOR loop.
# define INDICES_1 (A)(B)
/// Set up the second (middle) nested FOR loop.
# define INDICES_2 (C)(D)
/// Set up the third (inner) nested FOR loop (1 of 3).
# define INDICES_3a (E)(F)
/// Set up the third (inner) nested FOR loop (2 of 3).
# define INDICES_3b (G)(H)
/// Set up the third (inner) nested FOR loop (3 of 3).
# define INDICES_3c (I)(J)
// Set up the number of iterations (see the Boost.Preprocessor library).
// Set up the filename to be called (which is this one, see the Boost.Preprocessor library).
# define BOOST_PP_ITERATION_PARAMS_1 (3, (0, BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(INDICES_1)), "file.hpp"))
// Iterate (see the Boost.Preprocessor library) on the first (most outer) nested FOR loop.
# include BOOST_PP_ITERATE()
# endif // __FILE_HPP__
// Choose the first iteration.
#elif BOOST_PP_ITERATION_DEPTH() == 1
// Set up the number of iterations (see the Boost.Preprocessor library).
// Set up the filename to be called (which is this one, see the Boost.Preprocessor library).
# define BOOST_PP_ITERATION_PARAMS_2 (3, (0, BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(INDICES_2)), "file.hpp"))
// Iterate (see the Boost.Preprocessor library) on the second (middle) nested FOR loop.
# include BOOST_PP_ITERATE()
// Choose the second iteration.
#elif BOOST_PP_ITERATION_DEPTH() == 2
// Set up the number of iterations (see the Boost.Preprocessor library).
// Set up the filename to be called (which is this one, see the Boost.Preprocessor library).
# define BOOST_PP_ITERATION_PARAMS_3 (4, (0, BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(INDICES_3a)), "file.hpp", 0))
// Iterate (see the Boost.Preprocessor library) on the third (inner) nested FOR loop (1 of 3).
# include BOOST_PP_ITERATE()
// Set up the number of iterations (see the Boost.Preprocessor library).
// Set up the filename to be called (which is this one, see the Boost.Preprocessor library).
# define BOOST_PP_ITERATION_PARAMS_3 (4, (0, BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(INDICES_3b)), "file.hpp", 1))
// Iterate (see the Boost.Preprocessor library) on the third (inner) nested FOR loop (2 of 3).
# include BOOST_PP_ITERATE()
// Set up the number of iterations (see the Boost.Preprocessor library).
// Set up the filename to be called (which is this one, see the Boost.Preprocessor library).
# define BOOST_PP_ITERATION_PARAMS_3 (4, (0, BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(INDICES_3c)), "file.hpp", 2))
// Iterate (see the Boost.Preprocessor library) on the third (inner) nested FOR loop (3 of 3).
# include BOOST_PP_ITERATE()
// Look for the third nested loop, but index over INDICES_3a this time.
#elif BOOST_PP_ITERATION_DEPTH() == 3 && BOOST_PP_ITERATION_FLAGS() == 0
// Look for the third nested loop, but index over INDICES_3b this time.
#elif BOOST_PP_ITERATION_DEPTH() == 3 && BOOST_PP_ITERATION_FLAGS() == 1
// Look for the third nested loop, but index over INDICES_3c this time.
#elif BOOST_PP_ITERATION_DEPTH() == 3 && BOOST_PP_ITERATION_FLAGS() == 2
#endif // BOOST_PP_IS_ITERATING