37

任何人都可以告诉我在使用 unix 时如何在 c++ 中激活 RTTI。听说可以禁用和启用。在我的 Unix 环境中,我如何检查 RTTI 是启用还是禁用?

aCC在 HPUX 上使用编译器。

4

7 回答 7

27

您使用的是g++还是其他编译器?

g++RTTI 中默认启用 IIRC,您可以使用-fno-rtti. 要测试它是否处于活动状态,请使用dynamic_casttypeid

更新

我相信 HPUX 的aCC/aC++默认情况下也有 RTTI,我不知道禁用它的方法。检查您的man网页

于 2010-04-14T05:47:51.220 回答
21

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
于 2010-04-14T05:46:32.353 回答
8

根据文档,没有选项可以关闭它。可以有选择地禁用的标准 C++ 中仅有的两位是“for 循环中的变量范围”(-Wc,ansi_for_scope,off)和名称的参数依赖查找(-Wc,-koenig_lookup,off)。没有类似的选项-Wc,-RTTI,off

于 2010-04-14T09:08:18.047 回答
6

我所知道的所有现代 C++ 编译器(GCC、Intel、MSVC、SunStudio、aCC)都默认启用 RTTI,所以除非您怀疑它可能由于某种原因被禁用,否则您可以放心地假设 RTTI 处于打开状态。

于 2010-04-14T06:36:32.533 回答
2

通过编译器选项编译程序时,RTTI 将被启用或禁用——它不是在全局 Unix 环境中启用或禁用的东西。查看编译器是否默认启用的最简单方法是尝试使用 RTTI 编译一些代码。

启用/禁用 RTTI 的选项将特定于编译器 - 您使用的是什么编译器?

RTTI 支持默认情况下在 GCC 中打开,该选项-fno-rtti关闭支持(如果您使用 GCC,并且可能有人在 makefile 或其他东西中关闭了 RTTI)。

于 2010-04-14T05:47:49.487 回答
1

启用和禁用 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;
}
于 2010-04-14T06:08:48.883 回答
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和许多其他可以使这些事情变得更容易的宏。

于 2014-10-08T17:46:43.620 回答