C++ BOOST_NO_异常是否保证与-fno异常的兼容性?
我想将Boost.Filesystem与C++ BOOST_NO_异常是否保证与-fno异常的兼容性?,c++,exception,boost,C++,Exception,Boost,我想将Boost.Filesystem与-fno异常一起使用。根据声明,它支持BOOST\u无异常宏 但是,以下方面: #定义BOOST\u无异常 #包括 int main(){} 汇编时使用: g++-fno异常boost_test.cpp 给出了错误: /…/boost/filesystem/operations.hpp:在构造函数中 'boost::filesystem::filesystem\u error::filesystem\u error(常量字符串&, boost::syst
-fno异常一起使用。根据声明,它支持BOOST\u无异常
宏
但是,以下方面:
#定义BOOST\u无异常
#包括
int main(){}
汇编时使用:
g++-fno异常boost_test.cpp
给出了错误:
/…/boost/filesystem/operations.hpp:在构造函数中
'boost::filesystem::filesystem\u error::filesystem\u error(常量字符串&,
boost::system::错误(U代码)“”:
/…/boost/filesystem/operations.hpp:84:16:错误:
异常处理已禁用,请使用-feexceptions启用
catch(…){m_imp_ptr.reset();}
我在MacOSX上使用GCC5和BoostVersion1.57进行编译(同样在类似的ubuntu设置上进行了测试)
我想知道我对BOOST\u NO\u EXCEPTIONS
的理解是否正确,因为它应该涵盖-fno EXCEPTIONS
的用法,或者它是否只是针对BOOST::throw\u exception
部分?这是文档所说的:
文件系统库引发的所有异常都是通过调用boost::throw\u exception()实现的。因此,根据编译文件系统源文件时的BOOST_NO_异常,具体行为可能会有所不同
在我的理解中,它并没有真正说它支持BOOST\u无例外
当我在文件系统目录下执行一个egrep-rboost\u NO\u EXCEPTIONS
时,我什么也没发现
在我阅读了源代码之后,它支持我的猜测。在代码中有许多地方使用try{…}catch(…)
。您还可以从收到的错误消息中判断。以下是一个例子:
filesystem_error(
const std::string & what_arg, const path& path1_arg,
const path& path2_arg, system::error_code ec)
: system::system_error(ec, what_arg)
{
try
{
m_imp_ptr.reset(new m_imp);
m_imp_ptr->m_path1 = path1_arg;
m_imp_ptr->m_path2 = path2_arg;
}
catch (...) { m_imp_ptr.reset(); }
}
如果您阅读,BOOST\u NO\u EXCEPTIONS
的语义实际上不是禁用异常,而是:
将所有异常转发到的用户定义的非模板版本
boost::抛出异常
在这里,“不”是显而易见的答案,g++无法处理filesystem\u错误类。boost/filesystem/config.hpp中有一个humdinger:
// throw an exception ----------------------------------------------------------------//
//
// Exceptions were originally thrown via boost::throw_exception().
// As throw_exception() became more complex, it caused user error reporting
// to be harder to interpret, since the exception reported became much more complex.
// The immediate fix was to throw directly, wrapped in a macro to make any later change
// easier.
#define BOOST_FILESYSTEM_THROW(EX) throw EX
此宏在libs/filesystem/src/operations.cpp中广泛用于抛出异常。这是一场表演
Fwiw,您的示例程序似乎只在clang和MSVC++中正确编译,他们只在后端抱怨必须发出异常处理代码,而g++在前端这样做。clang/msvc++对此示例代码没有抱怨,因为该异常处理代码早在构建boost库时就已经发出了
这表明了您的方法的另一个严重问题,您可能最初构建的boost实际上没有-fno异常。不太好。用Clang 3.6为我编译,可以用GCC 5.1复制。它承诺使用boost::throw_exception()
明确承诺它支持boost_NO_exception
(通过使用boost exception)。实现细节是Boost异常的一部分,而不是文件系统库,这是有道理的。所有这些都很难解决defineBOOST\u NO\u EXCEPTIONS
是否应该使代码-fno EXCEPTIONS
兼容的问题。@sehe,问题是,代码已经使用了try{}catch(…)
,If应该在文件系统中的代码周围使用BOOST\u NO\u异常,以支持-fno异常
。BOOST的最新版本(至少)使用BOOST\u TRY
、BOOST\u CATCH
等,当BOOST\u NO\u异常
未定义时,扩展到TRY
、CATCH
,等等,但如果(true)
,else if(false)
等。确实是一个累赘,因为BOOST_FILESYSTEM_THROW()和FILESYSTEM_error实际上在BOOST::FILESYSTEM函数(特别是在operations.cpp中)中被广泛使用。啊,是的,完全忽略了这一点。谢谢
// throw an exception ----------------------------------------------------------------//
//
// Exceptions were originally thrown via boost::throw_exception().
// As throw_exception() became more complex, it caused user error reporting
// to be harder to interpret, since the exception reported became much more complex.
// The immediate fix was to throw directly, wrapped in a macro to make any later change
// easier.
#define BOOST_FILESYSTEM_THROW(EX) throw EX