如果在user.hpp中定义了BOOST_NO_EXCEPTIONS,则无法编译boost :: shared_ptr

时间:2015-11-12 03:43:43

标签: c++ boost

我有一个嵌入式系统,并希望在此系统中使用boost,但需要禁用异常,因为我不想支付异常费用。

Boost已经给出了一个user.hpp和可设置的宏选项 BOOST_NO_EXCEPTIONS BOOST_NO_EXCEPTION_STD_NAMESPACE ,但是boost :: shared_ptr无法编译(更确切地说,无法链接)如果定义了这两个宏。

shared_ptr_boost.cpp:(.text._ZN5boost6detail12shared_countC2IiEEPT_[_ZN5boost6detail12shared_countC5IiEEPT_]+0x7a): undefined reference to `boost::throw_exception(std::exception const&)'
collect2: error: ld returned 1 exit status

为什么boost会提供宏选项,但不承诺使用这些选项进行编译?

2 个答案:

答案 0 :(得分:9)

可以编译。

它无法链接。

这是因为如果您定义BOOST_NO_EXCEPTIONS,则必须在某处提供boost::throw_exception(std::exception const&)的实现,以替换通常的错误提升工具。

阅读throw_exception.hpp中的注释:

namespace boost
{

#ifdef BOOST_NO_EXCEPTIONS

void throw_exception(std::exception const & e); // user defined

#else

//[Not user defined --Dynguss]
template<class E> inline void throw_exception(E const & e)  
{
    throw e;
}

#endif

} // namespace boost

答案 1 :(得分:-1)

这是我的最终解决方案。

shared_ptr_boost.cpp:

#include <boost/shared_ptr.hpp>
#include <stdio.h>
#include <exception>

namespace boost{
  void throw_exception(std::exception const &e){}
}
int main(){
  boost::shared_ptr<int> pName(new int(2));
  *pName += 3;
  printf("name = %d\n", *pName);
  return 0;
}

编译命令:

arm-hisiv100-linux-uclibcgnueabi-g++ -I../boost_1_59_0/ -DBOOST_NO_EXCEPTIONS -DBOOST_NO_EXCEPTION_STD_NAMESPACE -fno-exceptions shared_ptr_boost.cpp

对于这么小的测试程序,我得到大约1.7K的可执行文件;那是我不想为异常付出的代价。