预处理器循环头文件序列

时间:2013-12-18 15:33:44

标签: c++ boost-preprocessor

是否可以包含一系列文件: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生成的文件解决了我的问题。我遇到过这个问题,因为有时可能会生成一个大的包含文件序列(不应该因为可读性而合并)而且我不确定如何在不明确写入所有文件名的情况下包含所有这些文件序列,所以我想到了预处理器循环,到目前为止我的解决方案当然是丑陋的:-),但它的发烧友:-)

1 个答案:

答案 0 :(得分:1)

这适用于g ++:

在include路径中有一个目录预处理器,这个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>

限制:文件位于包含路径中。