【发布时间】:2023-03-05 11:35:01
【问题描述】:
在 unix 上工作时,谁能告诉我如何在 c++ 中激活 RTTI。 听说可以禁用和启用。 在我的 unix 环境中,我如何检查 RTTI 是启用还是禁用?
我在 HPUX 上使用 aCC 编译器。
【问题讨论】:
在 unix 上工作时,谁能告诉我如何在 c++ 中激活 RTTI。 听说可以禁用和启用。 在我的 unix 环境中,我如何检查 RTTI 是启用还是禁用?
我在 HPUX 上使用 aCC 编译器。
【问题讨论】:
您使用的是g++ 还是其他编译器?
在g++ 中,RTTI 默认启用 IIRC,您可以使用-fno-rtti 禁用它。要测试它是否处于活动状态,请使用 dynamic_cast 或 typeid
我相信 HPUX 的 aCC/aC++ 默认情况下也启用了 RTTI,我不知道有什么方法可以禁用它。检查your man pages。
【讨论】:
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
【讨论】:
根据the docs,没有关闭它的选项。可以选择性禁用的标准 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 的选项将取决于编译器 - 您使用的是什么编译器?
在 GCC 中,RTTI 支持默认开启,-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++ 中,您可以测试 the __GXX_RTTI macro 以查看您的代码中是否启用了 RTTI。正如其他人指出的那样 -no-rtti 在 g++ 中转向 RTTI。我敢打赌,这两种方法在 clang 中也可以使用。
#ifdef __GXX_RTTI
w = dynamic_cast<FooBah*>(FooFactory(TYPE, arg));
if (w != NULL)
{
if (w->thing == OK)
FeastOnOrangUtansAndFruitBatsAndBreakfastCereals();
}
#endif
在较新的 C++ 中,我们将可以访问 feature testing macros __cpp_rtti 和许多其他内容,这将使这些事情变得更容易。
【讨论】: