Почему ловушка std:: bad_cast не работает на FreeBSD 9?
Рассмотрим этот код (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;
}
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 [email protected]:/usr/obj/usr/src/sys/GENERIC amd64
Debian Linux 6:
$ g++ badcast.cpp -o badcast -Wall && ./badcast
bad cast
OS X 10.8:
$ g++ badcast.cpp -o badcast -Wall && ./badcast
bad cast
Почему ловушка bad_cast не работает на FreeBSD?
Ответы
Ответ 1
Как можно предположить, что во FreeBSD вы можете использовать LLVMs новый libc++
вместо старого GNU libstdc++
. FreeBSD был работает для переключения на LLVM toolchain, от лицензированного программного обеспечения GNU GPL.
Яблоки тоже двигаются, а в прошлом я сталкивался с проблемами, возникающими для Mac, используя libc++
, который libstdc++
не имел (особенно с Boost).
Вы можете использовать ldd
, чтобы подтвердить, какие библиотеки вы ссылаетесь:
ldd ./badcast
Если он ссылается на libc++
, вы можете записать ошибку и тестовый пример с помощью проекта LLVM.