C++ 预处理器在头文件序列上循环

C++ 预处理器在头文件序列上循环,c++,boost-preprocessor,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_

是否可以包含一系列文件:
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) \
应该扩展到

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

这适用于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
#如果!BOOST\u PP\u正在迭代
#ifndef包含\u范围\u前缀
#缺少INCLUDE\u RANGE\u前缀时出错
#恩迪夫
#ifndef包括\u范围\u最小值
#缺少包含范围最小值时出错
#恩迪夫
#ifndef包括\u范围\u最大值
#缺少包含范围最大值时出错
#恩迪夫
#包括
#定义BOOST_PP_迭代_参数_1(3\
(包括范围最小值,包括范围最大值)
#包括BOOST_PP_ITERATE()
#否则
#定义INCLUDE_RANGE_PATH_后缀(F,N)F##N
#定义包含范围路径(F,N)
#include_RANGE_PATH(include_RANGE_前缀,BOOST_PP_迭代())
#如果BOOST\u PP\u迭代\u DEPTH()=包含范围\u MAX-包含范围\u MIN+1
#未定义包含范围前缀
#未定义包含范围最小值
#未定义包含范围最大值
#恩迪夫
#恩迪夫
您可以包括一系列文件(文件2、文件3、文件4):

#定义包含范围前缀文件
#定义包含范围最小值2
#定义包含范围最大值4
#包括

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

根据情况,最好自动生成包含所有这些头文件的头文件,然后只包含这个自动生成的头文件。如果你还可以把循环索引连接到定义中,我想有几种用法,因为C和C++标准在宏替换中关于重新扫描的条款中有这样的措辞,这是很困难的。“生成的完全由宏替换的预处理令牌序列不会作为预处理指令进行处理,即使它类似于预处理指令“。然而,我看到了一些非常令人惊讶的预处理器技术,所以我不敢大胆地说这是不可能的。关于乔纳森的问题,你可能想读一读。您只向我们提供您想要使用的解决方案,但没有告诉我们您试图解决的问题。可能还有其他,甚至更好的解决方案。是否有必要使用预处理器来实现这一点,或者使用运行的预构建脚本是否更好?请您详细说明一下这里发生的事情,我看到一些递归的
#include_RANGE_路径(include_RANGE_前缀,BOOST_PP_迭代())
@Gabriel那#包括#范围(include)路径。。。不是递归的,它只是对#include BOOST_PP_ITERATE()结果的评估
#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
#define INCLUDE_RANGE_PREFIX file
#define INCLUDE_RANGE_MIN 2
#define INCLUDE_RANGE_MAX 4
#include <preprocessor/include_range.h>