私は Chris Becke の見解には同意しませんが、彼のアプローチの利点を理解しています。
欠点は、ライブラリ間での共有が禁止されているため、ユーティリティ オブジェクトのライブラリを作成できないことです。
Chris のソリューションの拡張
VS バージョン間で一貫した dll バイナリを作成する方法は?
どちらを選択するかは、コンパイラがどれだけ異なるかによって異なります。一方では、同じコンパイラの異なるバージョンが同じ方法でデータの配置を処理できるため、DLL 間で構造体とクラスを公開できます。反対に、他のライブラリ コンパイラやコンパイル オプションを信用できない可能性があります。
Windows Win32 API では、「ハンドラ」を介して問題を処理しました。次の方法で同じことを行います。
1 - 構造体を公開しません。ポインターのみを公開する(つまり、void * ポインター)
2 - この構造体データのアクセスは、ポインターを最初のパラメーターとして受け取る関数を介して行われます
3 - この構造体のポインターの割り当て/割り当て解除データは、関数を介して行われます
このようにして、構造体が変更されたときにすべてを再コンパイルすることを避けることができます。
これを行う C++ の方法は PImpl です。http://en.wikipedia.org/wiki/Opaque_pointerを参照してください
上記の void * 概念と同じ動作をしますが、PImpl を使用すると、RAII とカプセル化の両方を使用でき、強い型の安全性から利益を得ることができます。これには互換性のある装飾 (同じコンパイラー) が必要ですが、同じランタイムまたはバージョン (バージョン間で装飾が同じである場合) は必要ありません。
別の解決策は?
異なるコンパイラ/コンパイラ バージョンの DLL を混ぜ合わせることを期待することは、(質問で説明したように) 災害のレシピであるか、基本的な C コーディングにフォールバックするためにコードのほとんど (すべてではないにしても) の C++ ソリューションを手放したため退屈です。 、 または両方。
私の解決策は次のとおりです。
1 - すべてのモジュールが同じコンパイラ/バージョンでコンパイルされていることを確認してください。限目。
2 - すべてのモジュールが同じランタイムと動的にリンクするようにコンパイルされている
ことを確認してくださいVS バージョン間で一貫性のある dll バイナリを作成する方法の Chris Becke による当然のことです。.
アプリケーションのすべてのモジュールを同じコンパイラと同じバージョンのコンパイラに対してコンパイルすることを義務付けるのは、驚くべきことでも法外なことでもないことに注意してください。
コンパイラを混在させることが良いことだと誰にも言わせないでください。そうではない。コンパイラを混在させる自由は、ほとんどの人にとって、建物の上から飛び降りることで享受できるのと同じ種類の自由です。自由にそうすることができますが、通常はそれを望まないだけです。
私のソリューションにより、次のことが可能になります。
1 - クラスをエクスポートし、実際のキャストされていないC++ ライブラリを作成します (たとえば、Visual C++ の __declspec(dllexport) で行う必要があるように)
2 -割り当ての所有権を譲渡します (割り当てと/またはインラインコードまたは STL の割り当て解除)
3 -各モジュールが独自のバージョンのランタイムを持っているという事実に関連する問題に悩まされないでください(つまり、メモリ割り当て、および C または C++ API によって使用される一部のグローバルデータ)。
これは、モジュールのデバッグ バージョンを他のモジュールのリリース バージョンと混在させてはならないことを意味することに注意してください。アプリは完全にデバッグ中か、完全にリリース中です。