3

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

4

1 回答 1

1

这适用于 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>

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

于 2013-12-18T16:18:37.507 回答