C++ BOOST_NO_异常是否保证与-fno异常的兼容性?

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

我想将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::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异常的一部分,而不是文件系统库,这是有道理的。所有这些都很难解决define
BOOST\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