Я использую boost 1.53.0 и до сих пор не имел проблем (и использовал сокеты, таймеры, контейнеры, алгоритмы, все без труппы).BOOST_THROW_EXCEPTION вызывает бесконечную рекурсию
Мне нравится идея использования форсированных исключений, особенно из-за номера строки, а что нет.
однако, в моем (супер простой) код:
#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: «повышение :: 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). Я построил импульс с помощью следующей команды, если это помогает:
.\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
EDIT Добавление расширенных макросов:
выглядит макрос подставляет
::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" }
Можете ли вы дать полный минимальный рабочий пример, включая заголовочные файлы и т. Д.? –