我试图使用boost::exception
并将我的原型(prototype)代码压缩为Boost exception tutorial中的示例,但是当使用BOOST_THROW_EXCEPTION
宏运行代码时,我从程序中退出。
#include <iostream>
#include <boost/exception/all.hpp>
typedef boost::error_info<struct tag_my_info,int> my_info;
struct my_error: virtual boost::exception, virtual std::exception { };
void f() {
BOOST_THROW_EXCEPTION(my_error() << my_info(42));
// Uncomment the below (and comment the above) for the program to work
//throw my_error() << my_info(42);
}
int main(int argc, char** argv) {
try {
f();
}
catch(my_error& x) {
if(int const* mi = boost::get_error_info<my_info>(x)) {
std::cout << "My info: " << *mi << std::endl;
}
}
return 0;
}
使用
BOOST_THROW_EXCEPTION
宏运行代码:$ ./a.out
Abort trap
如果正如评论所说,我交换代码,一切都很好
$ ./a.out
My info: 42
以下是G++预处理程序对
f()
的输出void f() {
::boost::exception_detail::throw_exception_(my_error() << my_info(42),__PRETTY_FUNCTION__,"main.cpp",14);
}
软件版本为:
$ g++ -v
Using built-in specs.
Target: x86_64-apple-darwin10
Thread model: posix
gcc version 4.4.6 (GCC)
$ port list boost
boost @1.47.0 devel/boost
我正在使用MacPorts提供的工具在OSX SL上。我已经仔细检查了g++搜索路径,并且只有一份boost hpp文件的副本,这些副本属于上述boost软件包。
我不知道为什么调用中止陷阱。我承认我刚接触C++。
最佳答案
该问题是由使用g++的MacPorts版本引起的。 MP系统中有很多与异常和中止陷阱相关的票证(Google上有很多示例)。
使用XCode附带的g++版本可以解决此问题。