2015-07-13 2 views
4

Мне нужно разобрать некоторые файлы INI. Для этого я пытаюсь использовать boost::property_tree, но в моих системных исключениях не разрешено.boost :: property_tree без исключений

Как отключить поддержку исключений при использовании boost::property_tree?

Если этого не сделать, любые рекомендации для другой библиотеки очень ценятся.

После ответа от @sehe, я попробовал этот кусок кода, но без успеха:

#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(); 
     } 
}; 

Компиляция строка кода использует следующие параметры:

-c -DBOOST_USER_CONFIG="<user.hpp>" -DBOOST_NO_EXCEPTIONS -DBOOST_EXCEPTION_DISABLE -I.\toolchain\boost -I.\include Foo.cpp 

И, наконец, user.hpp файл:

#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 

Некоторые ошибки, возвращенные компилятором:

"boost/optional/optional.hpp", line 1047: Error: #312: no suitable user-defined conversion from "boost::bad_optional_access" to "const std::exception" exists 
      throw_exception(bad_optional_access()); 
          ^

"boost/property_tree/string_path.hpp", line 221: Error: #312: no suitable user-defined conversion from "boost::property_tree::ptree_bad_path" to "const std::exception" exists 
      BOOST_PROPERTY_TREE_THROW(ptree_bad_path("Path syntax error", *this)); 
     ^

"boost/property_tree/detail/ptree_implementation.hpp", line 78: Error: #742: namespace "boost" has no actual member "iterator_core_access" 
      friend class boost::iterator_core_access; 
          ^

PS: Я не использую широко доступный стандартный компилятор, но он успешно компиляции boost::smart_ptr, используя тот же процесс, описанный выше.

+0

Короткий ответ - забудьте об этом. Boost - это не ответ. Разбор ini-файлов тривиален, и 'property_tree' очень усложняет это с помощью неадекватной стратегии обработки ошибок. Накладные расходы просто не стоят. – EML

ответ

2

Вы можете настроить Повысьте исключение не использовать исключения:

Вам нужно определить BOOST_NO_EXCEPTIONS и далее осуществлять свой собственный C-стиль функции обработки исключений, как, например,

void throw_exception(std::exception const& e) { 
    std::cerr << "Fake exception: " << e.what() << "\n"; 
    std::exit(255); 
} 

Live On Coliru

#define BOOST_NO_EXCEPTIONS 
#include <iostream> 
#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); 
    } 
} 

using namespace boost::property_tree; 

int main() { 
    ptree pt; 
    read_ini(std::cin, pt); 

    write_ini(std::cout, pt.get_child("section5")); 
} 

Составитель с

g++ -std=c++11 -O3 -Wall -pedantic main.cpp -fno-exceptions 

Это печатает

./test <<< "[section1]" 
Fake exception: No such node (section5) 
+0

Я сделал это, но теперь я получаю следующую ошибку: «boost/property_tree/string_path.hpp», строка 221: Ошибка: # 312: нет подходящего пользовательского преобразования из «boost :: property_tree :: ptree_bad_path» в " const std :: exception "существует BOOST_PROPERTY_TREE_THROW (ptree_bad_path (" Синтаксическая ошибка пути ", * это)); – Valmir

+0

@Valmir Кажется, у вас недостаточно кода. Возможно, вы наткнулись на ошибку там, но невозможно сказать без минимального кода с самодостаточным кодом – sehe

+0

Я обновил свой вопрос с помощью кода и ошибок. – Valmir