任何人都可以告诉我在使用 unix 时如何在 c++ 中激活 RTTI。听说可以禁用和启用。在我的 Unix 环境中,我如何检查 RTTI 是启用还是禁用?
我aCC
在 HPUX 上使用编译器。
您使用的是g++
还是其他编译器?
在g++
RTTI 中默认启用 IIRC,您可以使用-fno-rtti
. 要测试它是否处于活动状态,请使用dynamic_cast
或typeid
我相信 HPUX 的aCC
/aC++
默认情况下也有 RTTI,我不知道禁用它的方法。检查您的man
网页。
gcc 默认开启。检查 typeid(foo).name() 是否给你一些有用的东西。
#include <iostream>
#include <typeinfo>
int main()
{
std::cout << typeid(int).name() << std::endl;
return 0;
}
如果没有 RTTI,你会得到类似的东西:
foo.cpp:6: error: cannot use typeid with -fno-rtti
根据文档,没有选项可以关闭它。可以有选择地禁用的标准 C++ 中仅有的两位是“for 循环中的变量范围”(-Wc,ansi_for_scope,off
)和名称的参数依赖查找(-Wc,-koenig_lookup,off
)。没有类似的选项-Wc,-RTTI,off
我所知道的所有现代 C++ 编译器(GCC、Intel、MSVC、SunStudio、aCC)都默认启用 RTTI,所以除非您怀疑它可能由于某种原因被禁用,否则您可以放心地假设 RTTI 处于打开状态。
通过编译器选项编译程序时,RTTI 将被启用或禁用——它不是在全局 Unix 环境中启用或禁用的东西。查看编译器是否默认启用的最简单方法是尝试使用 RTTI 编译一些代码。
启用/禁用 RTTI 的选项将特定于编译器 - 您使用的是什么编译器?
RTTI 支持默认情况下在 GCC 中打开,该选项-fno-rtti
关闭支持(如果您使用 GCC,并且可能有人在 makefile 或其他东西中关闭了 RTTI)。
启用和禁用 RTTI 必须是编译器特定的设置。为了使dynamic_cast<>
操作、typeid
运算符或异常在 C++ 中工作,必须启用 RTTI。如果您可以编译以下代码,那么您已经启用了 RTTI(包括 g++ 在内的大多数编译器都会自动执行此操作):
#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;
}
在 g++ 中,您可以测试宏以查看您的代码中是否启用了 RTTI 。__GXX_RTTI
正如其他人指出的那样 -no-rtti 在 g++ 中转为 RTTI。我敢打赌,这两个东西在铿锵声中也有效。
#ifdef __GXX_RTTI
w = dynamic_cast<FooBah*>(FooFactory(TYPE, arg));
if (w != NULL)
{
if (w->thing == OK)
FeastOnOrangUtansAndFruitBatsAndBreakfastCereals();
}
#endif
在较新的 C++ 中,我们将可以访问功能测试宏 __cpp_rtti
和许多其他可以使这些事情变得更容易的宏。