c++ - 如何将 BOOST 包装在单独的命名空间中?

标签 c++ boost namespaces

我希望同时将两个版本的 BOOST 编译到一个项目中。理想情况下,它们应该可以按照以下方式使用:

boost_1_36_0::boost::shared_ptr<SomeClass> someClass = new SomeClass();
boost_1_35_0::boost::regex expression("[0-9]", boost_1_35_0::boost::regex_constants::basic);

最佳答案

我阅读(仔细扫描)了 development list discussion .没有简单的解决办法。总结:

  1. 在命名空间声明中包装头文件

    namespace boost_1_36_0 {
        #include <boost_1_36_0/boost/regex.hpp>
    }
    namespace boost_1_35_0 {
        #include <boost_1_35_0/boost/shared_ptr.hpp>
    }
    
    • 需要修改源文件
    • 不允许将两个版本包含在同一个翻译单元中,因为宏不尊重 namespace 。
  2. 在包含标题之前定义 boost

    #define boost boost_1_36_0
        #include <boost_1_36_0/boost/regex.hpp>
    #undef boost
    #define boost boost_1_35_0
        #include <boost_1_35_0/boost/shared_ptr.hpp>
    #undef boost
    
    • 源文件可以简单地用-Dboost=boost_1_36_0编译
    • 仍然没有解决单个翻译单元中的宏冲突。
    • 一些内部头文件包含可能会搞砸,因为这种事情确实会发生。

      #if defined(SOME_CONDITION)
      #  define HEADER <boost/some/header.hpp>
      #else
      #  define HEADER <boost/some/other/header.hpp>
      #endif
      

      但解决这些情况可能很容易。

  3. 修改整个 boost 库以将 namespace boost {..} 替换为 namespace boost_1_36_0 {...},然后提供命名空间别名。将所有 BOOST_XYZ 宏及其用法替换为 BOOST_1_36_0_XYZ 宏。
    • 如果您愿意付出努力,这可能会奏效。

关于c++ - 如何将 BOOST 包装在单独的命名空间中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/122782/

相关文章:

C++:查找代码执行时间的问题

c++ - 以没有尾随零的科学计数法打印 cpp_dec_float

c++ - 为什么在使用命名空间 foo 时不能在 sub::bar 中使用 foo::bar 函数?

c++ - C++ 中的参数相关名称查找 : point from n3290 Draft

c++ - 标记化 boost::regex 匹配

c++ - G++ - 未定义对已定义成员函数的引用

c++ - vector 中的移动元素未按预期工作

c++ - 使用 boost::property_tree::string_path 访问值

c++ - 在 CodeBlocks 中链接 Boost 库(使用 MinGW)

.net - IronPython 使用命名空间而无需导入