多重継承を許可しない 1 つのコンパイラでクラス A をコンパイルし、それをサポートするクラス B (およびクラス A から派生したクラス B) をコンパイルすると、どのような結果になるのか疑問に思っていました。
リンクの手順がよくわかりません...両方を併用することはできますか?この状況で vtables を使用して別のコンパイラを使用することには、どのような欠点がありますか? クラス B を使用するコードが適切に機能することは不可能でしょうか?
ありがとう。
多重継承を許可しない 1 つのコンパイラでクラス A をコンパイルし、それをサポートするクラス B (およびクラス A から派生したクラス B) をコンパイルすると、どのような結果になるのか疑問に思っていました。
リンクの手順がよくわかりません...両方を併用することはできますか?この状況で vtables を使用して別のコンパイラを使用することには、どのような欠点がありますか? クラス B を使用するコードが適切に機能することは不可能でしょうか?
ありがとう。
原則として、C++ プログラムの一部を異なるコンパイラでコンパイル しないでください。
異なるコンパイラは、シンボルマングリング段階で異なるマングリングスキーマを使用する可能性があり、多くの場合、使用するため、個別にコンパイルされたもの間のリンクが機能する可能性はほとんどありません。
name_manglingのマングリングに関するドキュメントを参照してください
オブジェクト レイアウト (vtable ポインターの場所、vtable 形式、サブオブジェクトの配置など) は、コンパイラ間で同じであるとは限りません。
お互いに話すことができないのはクラスだけではありません。ヘッダーで宣言されているが、いずれかのコンパイラによってのみコンパイルされた裸の関数は、名前マングリングのために他のコンパイラには見えません。
また、main() をコンパイルしないコンパイラによってコンパイルされたクラスの静的クラス/メンバーは、そのコンパイラのランタイムが実行されないため、正しく初期化されません。競合するランタイム ライブラリが原因で、64 ビットの long long 演算 (32 ビット プラットフォーム上) のようなものでさえ、正しくリンクされない場合があります。
上記の Arkaitz の投稿の補足として、異なるコンパイラでビルドされたコンパイル ユニットからのコードの連携を停止する可能性のある他の問題を見つけることができます。
基本的に、C++/C 標準が物事についてあまり具体的でないところはどこでも、コンパイラ間の違いの余地が残されているため、それらを混合する問題の余地があります。