【问题标题】:activate RTTI in c++在 C++ 中激活 RTTI
【发布时间】:2023-03-05 11:35:01
【问题描述】:

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

我在 HPUX 上使用 aCC 编译器。

【问题讨论】:

    标签: c++ rtti hp-ux acc


    【解决方案1】:

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

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

    更新

    我相信 HPUX 的 aCC/aC++ 默认情况下也启用了 RTTI,我不知道有什么方法可以禁用它。检查your man pages

    【讨论】:

    • 我正在使用 aCC (ansi c) 编译器来编译我的 C++ 程序。
    【解决方案2】:

    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】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

            【解决方案6】:

            启用和禁用 RTTI 必须是特定于编译器的设置。为了使dynamic_cast&lt;&gt; 操作、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;
            }
            

            【讨论】:

            • 如果 ii 使用 -fno-rtti 编译会发生什么?编译器会抱怨使用虚函数吗?
            • 只为那些对异常和 RTTI 之间的关系感到好奇的人。这是对该主题的讨论:stackoverflow.com/questions/10320072/… 总结,异常不需要启用 RTTI。因为它不使用它的特殊功能,如 dynamic_cast 和 typeid。但似乎它仍然使用一些运行时类型信息来匹配异常。
            【解决方案7】:

            在 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 和许多其他内容,这将使这些事情变得更容易。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-09-12
              • 2012-06-06
              • 1970-01-01
              • 2011-01-16
              • 1970-01-01
              • 2011-05-15
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多