[英]boost::property_tree without exceptions
我需要解析一些INI文件。 為此,我嘗試使用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
。
您可以將Boost Exception配置為不使用異常:
您需要定義BOOST_NO_EXCEPTIONS
並進一步實現您自己的C樣式異常處理函數,例如
void throw_exception(std::exception const& e) {
std::cerr << "Fake exception: " << e.what() << "\n";
std::exit(255);
}
#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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.