头文件序列上的预处理器循环

Preprocessor loop over sequence of header files

本文关键字:预处理 处理器 循环 文件      更新时间:2023-10-16

是否可以包含一系列文件: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

您可以包含一系列文件(文件 2、文件 3、文件 4):

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

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