UNIXで作業しているときにc ++でRTTIをアクティブにする方法を誰かに教えてもらえますか?無効にしたり有効にしたりできると聞きました。 UNIX環境では、RTTIが有効か無効かをどのように確認できますか?
HPUXではaCC
コンパイラを使用しています。
g++
または他のコンパイラを使用していますか?
g++
では、RTTIはデフォルトで有効になっています。IIRCは-fno-rtti
で無効にできます。アクティブかどうかをテストするには、dynamic_cast
またはtypeid
を使用します
HPUXのaCC
/aC++
もデフォルトでRTTIがオンになっていると思いますが、これを無効にする方法を知りません。 your man
pages を確認してください。
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
ドキュメント によると、これをオフにするオプションはありません。選択的に無効にできる標準C++の2ビットは、「forループ内の変数のスコープ」(-Wc,ansi_for_scope,off
)と名前の引数に依存するルックアップ(-Wc,-koenig_lookup,off
)のみです。 -Wc,-RTTI,off
に類似したオプションはありません
私が知っているすべての最新のC++コンパイラー(GCC、Intel、MSVC、SunStudio、aCC)はデフォルトでRTTIが有効になっているため、何らかの理由で無効にされている疑いがない限り、RTTIがオンになっていると安全に想定できます。
RTTIは、コンパイラオプションを介してプログラムをコンパイルするときに有効または無効になります。これは、Unix環境でグローバルに有効または無効にされるものではありません。コンパイラでデフォルトで有効になっているかどうかを確認する最も簡単な方法は、RTTIを使用してコードをコンパイルすることです。
RTTIを有効/無効にするオプションはコンパイラ固有です-どのコンパイラを使用していますか?
RTTIサポートは、GCCのデフォルトでオプション-fno-rtti
サポートをオフにします(GCCを使用していて、メイクファイルなどで誰かがRTTIをオフにしている場合があります)。
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;
}
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
や、これらを容易にする他の多くの機能にアクセスできます。