在 c++ 中激活 RTTI

发布于 2024-08-28 10:00:54 字数 142 浏览 12 评论 0原文

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

我在 HPUX 上使用 aCC 编译器。

Can anybody tell me how to activate RTTI in c++ when working on unix.
I heard that it can be disabled and enabled.
on my unix environment,how could i check whether RTTI is enabled or disabled?

I am using the aCC compiler on HPUX.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

李不 2024-09-04 10:00:54

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

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

UPDATE

我相信 HPUX 的 aCC/aC++ 也有RTTI 默认情况下处于打开状态,但我不知道如何禁用它。检查您的手册

Are you using g++ or some other compiler?

In g++ RTTI is enabled by default IIRC, and you can disable it with -fno-rtti. To test whether it is active or not use dynamic_cast or typeid

UPDATE

I believe that HPUX's aCC/aC++ also has RTTI on by default, and I am unaware of a way to disable it. Check your man pages.

动次打次papapa 2024-09-04 10:00:54

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

gcc has it on by default. Check if typeid(foo).name() gives you something useful:

#include <iostream>
#include <typeinfo>

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

Without RTTI you get something like:

foo.cpp:6: error: cannot use typeid with -fno-rtti
絕版丫頭 2024-09-04 10:00:54

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

According to the docs there is no option to turn it off. The only two bits of standard C++ that can be selectively disabled are "scope of variables in for loops" (-Wc,ansi_for_scope,off) and Argument-Dependent Lookup of names (-Wc,-koenig_lookup,off). There's no option similar to -Wc,-RTTI,off

我偏爱纯白色 2024-09-04 10:00:54

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

All modern C++ compilers I know (GCC, Intel, MSVC, SunStudio, aCC) have RTTI enabled by default, so unless you have any suspects that it may be disabled for some reason you may safely assume that RTTI in on.

软糖 2024-09-04 10:00:54

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

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

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

RTTI will be enabled or disabled when compiling your program via compiler options - it's not something enabled or disabled in the Unix environment globally. The easiest way to see if it's enabled by default for your compiler is to just try compiling some code using RTTI.

Options to enable/disable RTTI will be compiler specific - what compiler are you using?

RTTI support is on by default in GCC, the option -fno-rtti turns off support (in case you're using GCC and maybe someone's turned off RTTI in a makefile or something).

行至春深 2024-09-04 10:00:54

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

Enabling and disabling RTTI must be a compiler specific setting. In order for the dynamic_cast<> operation, the typeid operator or exceptions to work in C++, RTTI must be enabled. If you can get the following code compiled, then you already have RTTI enabled (which most compilers including g++ do automatically):

#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;
}
熊抱啵儿 2024-09-04 10:00:54

在 g++ 中,您可以测试 __GXX_RTTI 宏 查看您的代码中是否启用了 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++ 中,我们将可以访问功能测试宏 __cpp_rtti 和许多其他将使这些事情变得更容易的东西。

In g++ you can test the __GXX_RTTI macro to see if RTTI is on in your code. As others have pointed out -no-rtti turns of RTTI in g++. I would bet both these things work in clang as well.

#ifdef __GXX_RTTI
  w = dynamic_cast<FooBah*>(FooFactory(TYPE, arg));
  if (w != NULL)
  {
    if (w->thing == OK)
      FeastOnOrangUtansAndFruitBatsAndBreakfastCereals();
  }
#endif

In newer C++ we will have access to feature testing macros __cpp_rtti and many others that will make tese things easier.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文