2

多重継承を許可しない 1 つのコンパイラでクラス A をコンパイルし、それをサポートするクラス B (およびクラス A から派生したクラス B) をコンパイルすると、どのような結果になるのか疑問に思っていました。

リンクの手順がよくわかりません...両方を併用することはできますか?この状況で vtables を使用して別のコンパイラを使用することには、どのような欠点がありますか? クラス B を使用するコードが適切に機能することは不可能でしょうか?

ありがとう。

4

4 に答える 4

10

原則として、C++ プログラムの一部を異なるコンパイラでコンパイル しないでください。

異なるコンパイラは、シンボルマングリング段階で異なるマングリングスキーマを使用する可能性があり、多くの場合、使用するため、個別にコンパイルされたもの間のリンクが機能する可能性はほとんどありません。

name_manglingのマングリングに関するドキュメントを参照してください

于 2009-11-05T13:29:21.523 に答える
3

オブジェクト レイアウト (vtable ポインターの場所、vtable 形式、サブオブジェクトの配置など) は、コンパイラ間で同じであるとは限りません。

于 2009-11-05T13:35:40.783 に答える
2

お互いに話すことができないのはクラスだけではありません。ヘッダーで宣言されているが、いずれかのコンパイラによってのみコンパイルされた裸の関数は、名前マングリングのために他のコンパイラには見えません。

また、main() をコンパイルしないコンパイラによってコンパイルされたクラスの静的クラス/メンバーは、そのコンパイラのランタイムが実行されないため、正しく初期化されません。競合するランタイム ライブラリが原因で、64 ビットの long long 演算 (32 ビット プラットフォーム上) のようなものでさえ、正しくリンクされない場合があります。

于 2009-11-05T13:35:46.260 に答える
2

上記の Arkaitz の投稿の補足として、異なるコンパイラでビルドされたコンパイル ユニットからのコードの連携を停止する可能性のある他の問題を見つけることができます。

  1. データ サイズの問題 (たとえば、あるコンパイラは 32 ビットの int を使用し、他のコンパイラは 64 ビットを使用する)
  2. データ配置の問題
  3. ヒープメモリの問題

基本的に、C++/C 標準が物事についてあまり具体的でないところはどこでも、コンパイラ間の違いの余地が残されているため、それらを混合する問題の余地があります。

于 2009-11-05T13:37:30.080 に答える