#include <iostream>
#include <typeinfo>
class A {
public:
virtual ~A () { }
};
class B : public A { };
void rtti_test(A& a) {
try {
B& b = dynamic_cast<B&>(a);
} catch (std::bad_cast) {
std::cout << "Invalid cast.\n";
}
std::cout << "rtti is enabled in this compiler.\n";
}
int main() {
A *a1 = new B;
rtti_test(*a1); //valid cast
A *a2 = new A;
rtti_test(*a2); //invalid cast
return 0;
}
#ifdef __GXX_RTTI
w = dynamic_cast<FooBah*>(FooFactory(TYPE, arg));
if (w != NULL)
{
if (w->thing == OK)
FeastOnOrangUtansAndFruitBatsAndBreakfastCereals();
}
#endif
7条答案
按热度按时间htrmnn0y1#
你使用的是
g++
还是其他编译器?在
g++
中,默认情况下IIRC启用RTTI,您可以使用-fno-rtti
禁用它。要测试它是否处于活动状态,请使用dynamic_cast
或typeid
更新
我相信HPUX的
aCC
/aC++
默认也有RTTI,我不知道禁用它的方法。检查你的man
页面。31moq8wy2#
gcc默认打开了它。检查
typeid(foo).name()
是否提供了一些有用的信息:使用 out RTTI,您可以得到如下内容:
insrf1ej3#
根据the docs,没有关闭它的选项。标准C++中仅有的两个可以选择性禁用的位是“for循环中变量的作用域”(
-Wc,ansi_for_scope,off
)和名称的参数依赖查找(-Wc,-koenig_lookup,off
)。没有类似于-Wc,-RTTI,off
的选项yrefmtwq4#
我所知道的所有现代C++编译器(GCC,Intel,MSVC,SunStudio,aCC)都默认启用了RTTI,所以除非你怀疑它可能由于某种原因被禁用,否则你可以安全地假设RTTI是打开的。
zaq34kh65#
通过编译器选项编译程序时,RTTI将被启用或禁用-它不是在Unix环境中全局启用或禁用的东西。查看编译器是否默认启用RTTI的最简单方法是尝试使用RTTI编译一些代码。
启用/禁用RTTI的选项将是特定于编译器的-您使用的是什么编译器?
RTTI支持在GCC中默认打开,选项
-fno-rtti
关闭支持(如果您使用GCC,可能有人在makefile或其他文件中关闭了RTTI)。whitzsjs6#
启用和禁用RTTI必须是编译器特定的设置。为了使
dynamic_cast<>
操作、typeid
运算符或异常在C中工作,必须启用RTTI。如果您可以编译以下代码,则说明您已经启用了RTTI(包括g在内的大多数编译器都是自动启用的):83qze16e7#
在g中,你可以测试the
__GXX_RTTI
macro,看看RTTI在你的代码中是否打开了。正如其他人所指出的--在g中RTTI的no-rtti转换。我敢打赌这两件事在clang中也能工作。在较新的C++中,我们将可以访问feature testing macros
__cpp_rtti
和许多其他将使事情变得更容易。