考虑一下这段代码(badcast.cpp):
#include <exception>
#include <typeinfo>
#include <stdio.h>
class foo {
public:
virtual ~foo() {}
};
class bar: public foo {
public:
int val;
bar(): val(123) {}
};
static void
cast_test(const foo &f) {
try {
const bar &b = dynamic_cast<const bar &>(f);
printf("%d\n", b.val);
} catch (const std::bad_cast &) {
printf("bad cast\n");
}
}
int main() {
foo f;
cast_test(f);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
FreeBSD 9.1:
$ g++ badcast.cpp -o badcast -Wall && ./badcast
terminate called after throwing an instance of 'std::bad_cast'
what(): std::bad_cast
Abort trap (core dumped)
$ g++ badcast.cpp -o badcast -frtti -fexceptions -Wall && ./badcast
terminate called after throwing an instance of 'std::bad_cast'
what(): std::bad_cast
Abort trap (core dumped)
$ gcc -v
Using built-in specs.
Target: amd64-undermydesk-freebsd
Configured with: FreeBSD/amd64 system compiler
Thread model: posix
gcc version 4.2.1 20070831 patched [FreeBSD]
$ uname -a
FreeBSD freebsd9 9.1-RELEASE FreeBSD 9.1-RELEASE #0 r243825: Tue Dec 4 09:23:10 UTC 2012 root@farrell.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC amd64
Run Code Online (Sandbox Code Playgroud)
Debian Linux 6:
$ g++ badcast.cpp -o badcast -Wall && ./badcast
bad cast
Run Code Online (Sandbox Code Playgroud)
OS X 10.8:
$ g++ badcast.cpp -o badcast -Wall && ./badcast
bad cast
Run Code Online (Sandbox Code Playgroud)
为什么捕捉bad_cast不能在FreeBSD上运行?
作为一个疯狂的猜测,\xe2\x80\x99s 在 FreeBSD 中你可能会使用 LLVM\xe2\x80\x99s new libc++,而不是旧的 GNU libstdc++。FreeBSD 一直致力于从 GNU GPL 许可软件转向LLVM 工具链。
Apple\xe2\x80\x99s 也在朝着这个方向发展,过去我\xe2\x80\x99 也遇到过使用libc++该方法为 Mac 开发的问题libstdc++ xe2\x80\x99 则没有(特别是使用 Boost)。
您可以使用它ldd来确认您\xe2\x80\x99 链接的库:
ldd ./badcast\nRun Code Online (Sandbox Code Playgroud)\n\n如果它是链接的libc++,您可能需要将 bug 和测试用例归档到LLVM 项目中。
| 归档时间: |
|
| 查看次数: |
548 次 |
| 最近记录: |