禁用boost :: smart_ptr的异常工作,但不禁用boost :: property_tree

时间:2015-07-14 12:44:43

标签: c++ exception boost boost-propertytree boost-smart-ptr

我正在使用boost 1.57。 我需要在我没有广泛使用的专有编译器中禁用异常支持。 当我需要使用order by时,以下步骤就像魅力一样:

  1. 使用以下order by文件(使用boost::smart_ptr进行编译)禁用C ++ 11支持:

    user.hpp
  2. 通知boost库不要使用例外:-DBOOST_USER_CONFIG="<user.hpp>"

  3. 导致以下编译行:#define BOOST_HAS_NRVO #define BOOST_NO_COMPLETE_VALUE_INITIALIZATION #define BOOST_NO_CXX11_AUTO_DECLARATIONS #define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS #define BOOST_NO_CXX11_CHAR16_T #define BOOST_NO_CXX11_CHAR32_T #define BOOST_NO_CXX11_CONSTEXPR #define BOOST_NO_CXX11_DECLTYPE #define BOOST_NO_CXX11_DECLTYPE_N3276 #define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS #define BOOST_NO_CXX11_DELETED_FUNCTIONS #define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS #define BOOST_NO_CXX11_FINAL #define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS #define BOOST_NO_CXX11_LAMBDAS #define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS #define BOOST_NO_CXX11_NOEXCEPT #define BOOST_NO_CXX11_NULLPTR #define BOOST_NO_CXX11_RANGE_BASED_FOR #define BOOST_NO_CXX11_RAW_LITERALS #define BOOST_NO_CXX11_REF_QUALIFIERS #define BOOST_NO_CXX11_RVALUE_REFERENCES #define BOOST_NO_CXX11_SCOPED_ENUMS #define BOOST_NO_CXX11_STATIC_ASSERT #define BOOST_NO_CXX11_TEMPLATE_ALIASES #define BOOST_NO_CXX11_UNICODE_LITERALS #define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX #define BOOST_NO_CXX11_USER_DEFINED_LITERALS #define BOOST_NO_CXX11_VARIADIC_MACROS #define BOOST_NO_CXX11_VARIADIC_TEMPLATES #define BOOST_NO_SFINAE_EXPR #define BOOST_NO_TWO_PHASE_NAME_LOOKUP

  4. 然后成功编译了以下代码:

    -DBOOST_NO_EXCEPTIONS -DBOOST_EXCEPTION_DISABLE

    但是当我尝试将上述方法与以下源代码一起使用时,编译出错了:

    MyCOMPILER -DBOOST_USER_CONFIG="<user.hpp>" -DBOOST_NO_EXCEPTIONS -DBOOST_EXCEPTION_DISABLE -c Foo.cpp -o Foo.o

    导致以下错误:

    #include <iostream>
    #include <string>
    #include <boost/shared_ptr.hpp>
    #include <boost/smart_ptr/make_shared.hpp>
    
    namespace boost {
        void throw_exception(std::exception const& e) {
            std::cerr << "Fake exception: " << e.what() << "\n";
            std::exit(255);
        }
    }
    
    class Foo {
      private:
        boost::shared_ptr<int> ptr;
      public:
        bool bar(const std::string file_name) {
          ptr = boost::make_shared<int>();
          return true;
        }
    };
    

    最后一个问题:

    为什么在第一种情况下一切正常,但不是在第二种情况下? 如何在没有异常支持的情况下正确编译#include <iostream> #include <string> #include <boost/property_tree/ptree.hpp> #include <boost/property_tree/ini_parser.hpp> namespace boost { void throw_exception(std::exception const& e) { std::cerr << "Fake exception: " << e.what() << "\n"; std::exit(255); } } class Foo { public: bool bar(const std::string file_name) { boost::property_tree::ptree prop_tree; boost::property_tree::read_ini(file_name, prop_tree); return !prop_tree.empty(); } }; ?这甚至可能吗?

0 个答案:

没有答案