Препроцессор зацикливает последовательность заголовочных файлов

Можно ли включить последовательность файлов: file1,file2,file3
в цикле препроцессора?

#include <boost/preprocessor/iteration/local.hpp>
#include <boost/preprocessor/cat.hpp>

// needed whitespace here----*
#define BOOST_PP_LOCAL_LIMITS (1, 3)

#define GENERATE_FILE_NAME(n) \
BOOST_PP_STRINGIZE( BOOST_PP_CAT( file , n) ) \
/**/

#define BOOST_PP_LOCAL_MACRO(n) \
#include GENERATE_FILE_NAME(n) \

а затем использовать его с:

#include BOOST_PP_LOCAL_ITERATE()

следует расширить до

BOOST_PP_LOCAL_MACRO(1) --> includes file1
BOOST_PP_LOCAL_MACRO(2) --> includes file2
BOOST_PP_LOCAL_MACRO(3) --> includes file3

К сожалению, вышесказанное не работает из-за #include GENERATE_FILE_NAME(n) в макросе, который не расширяется …

Это вообще возможно?

Комментарий:
Я разместил этот вопрос, потому что мне было интересно, возможно ли это вообще. Я решил свою проблему, включив только один файл, который был создан из всех файлов file1 file2 file3, Я сталкивался с этим, потому что иногда можно генерировать большие последовательности включаемых файлов (которые не следует объединять только из-за читабельности), и я не был уверен, как включить все эти файлы без явной записи всех имен файлов, поэтому я подумал о циклах препроцессора, которые Конечно, мое решение пока еще ужаснее :-), но оно более модное 🙂

3

Решение

Это работает с g ++:

Наличие препроцессора каталога во включаемом пути и это include_range.h:

#if !BOOST_PP_IS_ITERATING

#ifndef INCLUDE_RANGE_PREFIX
#error Missing INCLUDE_RANGE_PREFIX
#endif
#ifndef INCLUDE_RANGE_MIN
#error Missing INCLUDE_RANGE_MIN
#endif
#ifndef INCLUDE_RANGE_MAX
#error Missing INCLUDE_RANGE_MAX
#endif

#include <boost/preprocessor/iteration/iterate.hpp>

#define BOOST_PP_ITERATION_PARAMS_1 (3, \
(INCLUDE_RANGE_MIN, INCLUDE_RANGE_MAX, <preprocessor/include_range.h>))
#include BOOST_PP_ITERATE()

#else

#define INCLUDE_RANGE_PATH_SUFFIX(F, N) F##N
#define INCLUDE_RANGE_PATH(F, N) <INCLUDE_RANGE_PATH_SUFFIX(F, N)>
#include INCLUDE_RANGE_PATH(INCLUDE_RANGE_PREFIX, BOOST_PP_ITERATION())

#if BOOST_PP_ITERATION_DEPTH() == INCLUDE_RANGE_MAX - INCLUDE_RANGE_MIN + 1
#undef INCLUDE_RANGE_PREFIX
#undef INCLUDE_RANGE_MIN
#undef INCLUDE_RANGE_MAX
#endif

#endif

Вы можете включить диапазон файлов (file2, file3, file4):

#define INCLUDE_RANGE_PREFIX file
#define INCLUDE_RANGE_MIN 2
#define INCLUDE_RANGE_MAX 4
#include <preprocessor/include_range.h>

Ограничение: файлы находятся в пути включения.

1

Другие решения

Других решений пока нет …