UNIXで作業しているときにC++でRTTIをアクティブ化する方法を教えてもらえますか。無効または有効にできると聞きました。UNIX環境で、RTTIが有効か無効かを確認するにはどうすればよいですか?
aCC
HPUXでコンパイラを使用しています。
g++
または他のコンパイラを使用していますか?
RTTIではg++
、デフォルトでIIRCが有効になっており、で無効にできます-fno-rtti
。それがアクティブであるかどうかをテストするには、またはを使用しdynamic_cast
ますtypeid
HPUXのaCC
/aC++
もデフォルトでRTTIがオンになっていると思いますが、これを無効にする方法を知りません。あなたのman
ページをチェックしてください。
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を使用していて、誰かがmakefileなどでRTTIをオフにしている場合)。
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;
}
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
やその他の多くの機能にアクセスできるようになります。