代码之家  ›  专栏  ›  技术社区  ›  Vijay

在C++中激活RTTI

  •  33
  • Vijay  · 技术社区  · 14 年前

    谁能告诉我在UNIX上工作时如何激活C++中的RTTI。 我听说它可以被禁用和启用。 在我的Unix环境中,如何检查RTTI是启用还是禁用?

    我正在使用 aCC HPUX上的编译器。

    7 回复  |  直到 10 年前
        1
  •  23
  •   vladr    14 年前

    你在用吗? g++ 还是其他编译器?

    G+ RTTI默认为IIRC启用,您可以使用 -fno-rtti . 测试它是否处于活动状态 dynamic_cast typeid

    更新

    我相信hpux的 aCC / aC++ 默认情况下也启用了rtti,我不知道如何禁用它。检查 your man pages .

        2
  •  20
  •   Eddy Pronk    14 年前

    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
    
        3
  •  8
  •   MSalters    14 年前

    根据 the docs 没有关闭的选项。唯一可以禁用的两个标准C++的位是“for for循环中的变量范围”。 -Wc,ansi_for_scope,off )与参数相关的名称查找( -Wc,-koenig_lookup,off )没有类似的选择 -Wc,-RTTI,off

        4
  •  6
  •   Artyom    14 年前

    所有我知道的现代C++编译器(GCC、英特尔、MSVC、SunStudio、ACC)都默认启用RTTI,所以除非您有任何怀疑它可能出于某种原因被禁用,否则您可能会安全地假定RTTI在ON上。

        5
  •  2
  •   Michael Burr    14 年前

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

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

    默认情况下,在gcc中启用rtti支持,选项 -fno-rtti 关闭支持(在使用gcc的情况下,可能有人关闭了makefile或其他文件中的rtti)。

        6
  •  1
  •   pablomtz    11 年前

    启用和禁用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;
    }
    
        7
  •  0
  •   emsr    10 年前

    在G++中,您可以测试 the __GXX_RTTI macro 查看代码中是否启用了RTTI。正如其他人所指出的,在G++中没有RTTI的旋转。我敢打赌这两样东西也会有效果。

    #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 还有很多其他能让Tese变得更简单的方法。