37

UNIXで作業しているときにC++でRTTIをアクティブ化する方法を教えてもらえますか。無効または有効にできると聞きました。UNIX環境で、RTTIが有効か無効かを確認するにはどうすればよいですか?

aCCHPUXでコンパイラを使用しています。

4

7 に答える 7

27

g++または他のコンパイラを使用していますか?

RTTIではg++、デフォルトでIIRCが有効になっており、で無効にできます-fno-rtti。それがアクティブであるかどうかをテストするには、またはを使用しdynamic_castますtypeid

アップデート

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++の2ビットは、「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<>操作、演算子、または例外をC ++で機能させるtypeidには、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 ++では__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やその他の多くの機能にアクセスできるようになります。

于 2014-10-08T17:46:43.620 に答える