- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我使用的是 boost 1.53.0,到目前为止没有遇到任何问题(并且使用了套接字、定时器、容器、算法,都没有问题)。
我喜欢使用 boost 异常的想法,尤其是因为行号等等。
但是,在我的( super 简单的)代码中:
#include <iostream>
#include <fstream>
#include <boost/scoped_ptr.hpp>
#include <boost/exception/all.hpp>
struct my_error: virtual boost::exception, virtual std::exception { };
int main(int argc, char* argv[])
{
try
{
BOOST_THROW_EXCEPTION(my_error());
}
catch(...)
{
std::cout <<"fail";
}
}
使用 CMAKE 生成的项目(希望这不会搞砸)
cmake_minimum_required (VERSION 2.8)
project(error_test)
IF(WIN32)
set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
set(Boost_NO_SYSTEM_PATHS FALSE)
ENDIF()
find_package(Boost COMPONENTS system date_time)
include_directories(${Boost_INCLUDE_DIRS}
)
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME}
${Boost_LIBRARIES})
BOOST_THROW_EXCEPTION 不是抛出,而是进入无限递归!
编译器甚至捕捉到这一点,并发出编译器警告
警告 C4717:“boost::exception_detail::throw_exception_”:在所有控制路径上递归,函数将导致运行时堆栈溢出。
它一直在打:
test.exe!boost::exception_detail::throw_exception_<my_error>(const my_error & x, const char * current_function, const char * file, int line) Line 84 + 0xd1 bytes C++
我正在使用 visual studio 2010(win 64)。我使用以下命令构建了 boost,如果有帮助的话:
.\b2 install --prefix=C:\devtools\boost_1_53_0 --toolset=msvc --build-type=complete --build-dir=C:\devtools\bin\boost_1_53_0 address-model=64 architecture=x86
编辑添加扩展宏:
看起来宏扩展为
::boost::exception_detail::throw_exception_(my_error(), __FUNCSIG__ ,"main.cpp",40);
扩展为
throw_exception_( E const & x, char const * current_function, char const * file, int line )
{
::boost::exception_detail::throw_exception_(set_info( set_info( set_info( enable_error_info(x), throw_function(current_function)), throw_file(file)), throw_line(line)), __FUNCSIG__ ,"C:\\devtools\\boost_1_53_0\\boost/throw_exception.hpp",91);
#line 92 "C:\devtools\boost_1_53_0\boost/throw_exception.hpp"
最佳答案
这真是太奇怪了。您可以在 https://svn.boost.org/svn/boost/tags/release/Boost_1_53_0/boost/throw_exception.hpp 轻松查看boost::exception::throw_exception_ 根本不是递归的。
我能看到这种事情发生的唯一方法是使用邪恶的宏。请尝试将其放入您的主文件中,在每个 include 指令之前和之后。
#if defined(throw_exception) || defined(throw_exception_)
#error Somebody set us up the bomb
#endif
关于c++ - BOOST_THROW_EXCEPTION 导致无限递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17251566/
我尝试使用 boost 异常并失败。有问题代码: struct exception_base : virtual std::exception, virtual boost::exception {
我正在尝试使用 boost::exception 并将我的原型(prototype)代码压缩为 Boost exception tutorial 中的示例但是,当使用 BOOST_THROW_EXCE
我经常最终使用抛出异常的三元组,这可能看起来有点奇怪但在初始化列表中节省了一天(因此有助于编写合理的构造函数,因此有助于 RAII,...)。例如。如果参数 a是 smart_ptr<>我们想要非 n
如何使用 BOOST_THROW_EXCEPTION 宏?什么作为参数?我不知道,我似乎找不到任何可读的例子。 最佳答案 您只需将一个异常对象传递给它: BOOST_THROW_EXCEPTION(s
我使用的是 boost 1.53.0,到目前为止没有遇到任何问题(并且使用了套接字、定时器、容器、算法,都没有问题)。 我喜欢使用 boost 异常的想法,尤其是因为行号等等。 但是,在我的( sup
我是一名优秀的程序员,十分优秀!