能否不受头文件包含顺序影响设置BOOST_MPL_LIMIT_LIST_SIZE?
解决头文件包含顺序依赖问题的方案
针对你遇到的Boost MPL宏定义被头文件包含顺序影响的问题,有以下几种靠谱的解决思路:
1. 全局编译选项中定义宏
直接在项目的编译选项里添加宏定义,让这些宏在所有头文件(包括Boost库头文件)被包含前就生效:
- GCC/Clang环境:添加编译参数
-DBOOST_MPL_CFG_NO_PREPROCESSED_HEADERS -DBOOST_MPL_LIMIT_LIST_SIZE=50 - MSVC环境:添加编译参数
/DBOOST_MPL_CFG_NO_PREPROCESSED_HEADERS /DBOOST_MPL_LIMIT_LIST_SIZE=50
这种方式彻底绕开头文件包含顺序的问题,所有代码看到的都是统一的宏值。
2. 统一前置宏配置头文件
新建一个专门的配置头文件(比如boost_mpl_config.h),把需要定义的Boost宏都放在里面:
#ifndef BOOST_MPL_CONFIG_H_ #define BOOST_MPL_CONFIG_H_ #define BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS #define BOOST_MPL_LIMIT_LIST_SIZE 50 #endif // BOOST_MPL_CONFIG_H_
然后修改file_1.h和file_2.h,要求它们在包含任何Boost库头文件之前,必须先包含这个配置头文件。比如file_1.h的结构要改成:
#include "boost_mpl_config.h" #include <boost/mpl/list.hpp> // file_1.h的其他内容
这样不管main_file.h里先包含哪个文件,Boost头文件在被引入时都会看到预先定义好的宏值,不会再使用默认的20,也不会触发宏重定义错误。
3. 给file_2.h的宏定义加安全保护
如果暂时不想改动全局配置或其他头文件,可以在file_2.h里给宏定义加上检测和清理逻辑,避免重定义错误:
#ifndef FILE_2_H_ #define FILE_2_H_ // 先清除已有定义再重新设置 #ifdef BOOST_MPL_LIMIT_LIST_SIZE #undef BOOST_MPL_LIMIT_LIST_SIZE #endif #define BOOST_MPL_LIMIT_LIST_SIZE 50 #ifdef BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS #undef BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS #endif #define BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS // 如果file_2.h需要包含Boost头文件,务必放在宏定义之后 #include <boost/mpl/list.hpp> #endif // FILE_2_H_
注意:这个方法只能解决宏重定义的编译错误,无法改变file_1.h已经引入的Boost头文件使用的默认值,所以更适合配合前两种方法使用,确保宏在所有Boost头文件加载前就生效。
内容的提问来源于stack exchange,提问作者n_90040
相关产品推荐
相关产品推荐

