web-dev-qa-db-ja.com

C ++でRTTIをアクティブにする

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

HPUXではaCCコンパイラを使用しています。

35
Vijay

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

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

更新

HPUXのaCC/aC++もデフォルトでRTTIがオンになっていると思いますが、これを無効にする方法を知りません。 your man pages を確認してください。

25
vladr

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
20
Eddy Pronk

ドキュメント によると、これをオフにするオプションはありません。選択的に無効にできる標準C++の2ビットは、「forループ内の変数のスコープ」(-Wc,ansi_for_scope,off)と名前の引数に依存するルックアップ(-Wc,-koenig_lookup,off)のみです。 -Wc,-RTTI,offに類似したオプションはありません

8
MSalters

私が知っているすべての最新のC++コンパイラー(GCC、Intel、MSVC、SunStudio、aCC)はデフォルトでRTTIが有効になっているため、何らかの理由で無効にされている疑いがない限り、RTTIがオンになっていると安全に想定できます。

6
Artyom

RTTIは、コンパイラオプションを介してプログラムをコンパイルするときに有効または無効になります。これは、Unix環境でグローバルに有効または無効にされるものではありません。コンパイラでデフォルトで有効になっているかどうかを確認する最も簡単な方法は、RTTIを使用してコードをコンパイルすることです。

RTTIを有効/無効にするオプションはコンパイラ固有です-どのコンパイラを使用していますか?

RTTIサポートは、GCCのデフォルトでオプション-fno-rttiサポートをオフにします(GCCを使用していて、メイクファイルなどで誰かがRTTIをオフにしている場合があります)。

2
Michael Burr

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;
}
1
Vijay Mathew

G ++では the __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や、これらを容易にする他の多くの機能にアクセスできます。

0
emsr