Можно ли включить последовательность файлов: 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
, Я сталкивался с этим, потому что иногда можно генерировать большие последовательности включаемых файлов (которые не следует объединять только из-за читабельности), и я не был уверен, как включить все эти файлы без явной записи всех имен файлов, поэтому я подумал о циклах препроцессора, которые Конечно, мое решение пока еще ужаснее :-), но оно более модное 🙂
Это работает с 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>
Ограничение: файлы находятся в пути включения.
Других решений пока нет …