【发布时间】:2013-09-13 10:13:50
【问题描述】:
如果编译 Boost 没有 C++11 支持 boost::filesystem 使用模拟范围枚举器。如果您随后将这个构建的 Boost 并在具有 C++11 支持的项目中使用它,您最终会丢失符号,因为 boost::filesystem::copy_file() 的声明已更改。
有一个简单的解决方法:
# if __cplusplus >= 201103L
# define NO_SCOPED_ENUMS
# endif
# ifdef NO_SCOPED_ENUMS
# if BOOST_VERSION < 105000
# ifndef BOOST_NO_SCOPED_ENUMS
# define BOOST_NO_SCOPED_ENUMS
# define REMOVE
# endif
# else
# ifndef BOOST_NO_CXX11_SCOPED_ENUMS
# define BOOST_NO_CXX11_SCOPED_ENUMS
# define REMOVE
# endif
# endif
# endif
# include "boost/filesystem.hpp"
# if defined(NO_SCOPED_ENUMS) && defined(REMOVE)
# undef REMOVE
# if BOOST_VERSION < 105000
# undef BOOST_NO_SCOPED_ENUMS
# else
# undef BOOST_NO_CXX11_SCOPED_ENUMS
# endif
# endif
此预处理位根据 Boost 版本定义 BOOST_NO_SCOPED_ENUMS 或 BOOST_NO_CXX11_SCOPED_ENUMS,包括 boost/filesystem,如果之前未定义,则将其再次删除(为了安全起见)
现在这里的问题是,当我们为 C++11 编译时,作用域枚举器被关闭了:
# if __cplusplus >= 201103L
# define NO_SCOPED_ENUMS
# endif
但是,如果 Boost 实际上已经编译 C++11 支持,这将再次中断,因为声明将被更改。它需要是这样的:
// BOOST_COMPILED_WITH_CXX11 doesn't exist
# if (__cplusplus >= 201103L) && !defined(BOOST_COMPILED_WITH_CXX11)
# define NO_SCOPED_ENUMS
# endif
这就是我的问题所在:
tl;dr - 我可以确定 Boost 是否在编译时支持 C++11?
我最近的found 是:
无论您如何运行配置脚本,当它完成时,您会在
<boost-root>/libs/config/目录中找到一个新标头-user.hpp-。 请注意,configure 默认情况下不会将此标头安装到您的 boost 包含路径中。此标头包含配置脚本生成的所有选项,以及包含默认版本(位于 /boost/config/ 下)中的用户可设置选项的标头部分。
【问题讨论】:
-
在上面的修复中,如果 BOOST_VERSION