コンパイラが RTTI を「サポート」していない場合、そのコンパイラは仮想関数を含むクラス階層を処理できないということですか? それとも、RTTI が移植可能ではないという文献を誤解しており、問題は別の場所にあるのでしょうか?
コメントありがとうございます!
コンパイラが RTTI を「サポート」していない場合、そのコンパイラは仮想関数を含むクラス階層を処理できないということですか? それとも、RTTI が移植可能ではないという文献を誤解しており、問題は別の場所にあるのでしょうか?
コメントありがとうございます!
これはおそらくあなたが探していた答えの多くですが、ここに行きます:
RTTI が「移植可能」でないということは、コンパイラー A を使用して動的ライブラリー A をビルドし、コンパイラー B を使用して A とリンクするアプリケーション B をビルドする場合、コンパイラー a と b の RTTI 実装が異なるため、RTTI を使用できないことを意味します。仮想機能が影響を受けるのは、仮想機能のメカニズムもバイナリ互換ではない可能性があるためです。
この問題は 90 年代半ばには非常に重要でしたが、現在では廃止されています。すべてのコンパイラが相互にバイナリ互換になったからではなく、その逆です。C++ 開発者は、リンク可能なライブラリではなく、C++ ライブラリをソース コードとして配布する必要があることを認識しています。C++ を C の拡張と見なす人にとっては、これは非常に不快ですが、オープン ソース環境で育ったより現代的なプログラマーにとっては、特別なことではありません。
90 年代半ばから現在にかけて変化したのは、価値のある知的財産を構成するものとそうでないものとの間の態度の違いです。つまり、実際には「表現テンプレート」に関する特許が USPO に登録されています。そのような所有者でさえ、特許が執行不能であることを認識しています。
C スタイルの「ヘッダーおよびバイナリ」ライブラリは、貴重なソース コードを難読化する方法として長い間見られていました。ビジネスは、難読化が保護よりも自滅的であることにますます気付くようになりました。「貴重な IP」ステータスを満たすコードはほとんどありません。ほとんどの人はライブラリを購入するのは、含まれている特別な IP のためではなく、自分でロールバックするよりも購入する方が安価だからです。実際、知的財産を適用する専門知識は、知的財産自体よりもはるかに価値があります。しかし、この IP を知らないために誰もこの IP を気にしないのであれば、あまり価値がありません。
これがオープンソースのしくみです。IP は自由に配布され、配布者はその IP を適用する際にコンサルタント料を受け取ります。自分で利益を上げてそれを理解できる人-彼らにとっては良いことです。しかし、それは標準ではありません。実際に起こっていることは、開発者が IP を理解し、それを実装する製品を購入することを雇用主に売り込むことです。ええ、「開発者コミュニティ」全体がこの前提に基づいて設立されています。
簡単に言うと、バイナリ (およびその後の RTTI) 互換性は、オープンソースの動きが始まると恐竜のようになり、同時に C++ テンプレート ライブラリが標準になりました。C++ ライブラリは、Perl、Python、JavaScript などのように、ずっと前に「ソース配布のみ」になりました。C++ コンパイラでコンパイルしたすべてのソースで動作するようにするには、RTTI がオンになっていることを確認してください (例外などのすべての C++ 標準機能内)。 、リンクするすべての C++ ライブラリも同様に、アプリのコンパイルに使用したのと同じオプションでコンパイルされていることを確認してください。
私の知る限り、デフォルトで RTTI を有効にしないコンパイラが 1 つ (そして 1 つだけ) あります。これは、同じことを行うための他の従来の方法があるためです。これらについて読むには、Don Box の優れた著作「Essential COM」を手に取ってください。
仮想機能には RTTI は必要ありません。
主に と に使用されdynamic_cast
ますtypeid
。
移植できない RTTI の唯一の部分は、 から返される文字列の形式ですtype_info::name()
。
c++filt
このような文字列を準拠した C++ 型に変換 (マングルを解除) するコンパイラ用のツールを見つけることができる限り、これでも勝てる可能性があります。
コンパイラが RTTI を「サポート」していない場合、そのコンパイラは仮想関数を含むクラス階層を処理できないということですか?
一般に、最近のすべての C++ コンパイラは RTTI をサポートしています...だから忘れてください。
それとも、RTTI が移植可能ではないという文献を誤解していて、問題は別の場所にあるのでしょうか?
今日の RTTI は移植可能で、最新のコンパイラで問題なく動作します...ただし、いくつかの特殊なケースが発生する場合があります。
ELF プラットフォーム (Linux) では、ライブラリを動的にロードし (つまり dlopen)、ライブラリと実行可能ファイルの間のクラスに dynamic_cast を実行しようとすると、実行可能ファイルをリンクするための正しいフラグ (-rdynamic) を渡さないと失敗する場合があります。
他のほとんどの場合...うまくいきます。