在C++中激活RTTI

rekjcdws  于 2023-04-01  发布在  其他
关注(0)|答案(7)|浏览(146)

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

我在HPUX上使用aCC编译器。

htrmnn0y

htrmnn0y1#

你使用的是g++还是其他编译器?
g++中,默认情况下IIRC启用RTTI,您可以使用-fno-rtti禁用它。要测试它是否处于活动状态,请使用dynamic_casttypeid

更新

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

31moq8wy

31moq8wy2#

gcc默认打开了它。检查typeid(foo).name()是否提供了一些有用的信息:

#include <iostream>
#include <typeinfo>

int main()
{
 std::cout << typeid(int).name() << std::endl;
 return 0;
}

使用 out RTTI,您可以得到如下内容:

foo.cpp:6: error: cannot use typeid with -fno-rtti
insrf1ej

insrf1ej3#

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

yrefmtwq

yrefmtwq4#

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

zaq34kh6

zaq34kh65#

通过编译器选项编译程序时,RTTI将被启用或禁用-它不是在Unix环境中全局启用或禁用的东西。查看编译器是否默认启用RTTI的最简单方法是尝试使用RTTI编译一些代码。
启用/禁用RTTI的选项将是特定于编译器的-您使用的是什么编译器?
RTTI支持在GCC中默认打开,选项-fno-rtti关闭支持(如果您使用GCC,可能有人在makefile或其他文件中关闭了RTTI)。

whitzsjs

whitzsjs6#

启用和禁用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;
}
83qze16e

83qze16e7#

在g中,你可以测试the __GXX_RTTI macro,看看RTTI在你的代码中是否打开了。正如其他人所指出的--在g中RTTI的no-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和许多其他将使事情变得更容易。

相关问题