私は現在、DLLとして配布されるWindows用のC ++ライブラリを開発しています。私の目標は、バイナリの相互運用性を最大化することです。より正確には、DLLの関数は、DLLを再コンパイルしなくても、MSVC ++とMinGWの複数のバージョンでコンパイルされたコードから使用できる必要があります。ただし、どの呼び出し規約が最適cdecl
か、またはについて混乱していstdcall
ます。
「コンパイラ間で同じであることが保証されているのはC呼び出し規約だけです」などのステートメントを聞くことがありますcdecl
。これは、「の解釈には、特に値を返す方法にいくつかのバリエーションがあります」などのステートメントとは対照的です。これは、特定のライブラリ開発者(libsndfileなど)が配布するDLLでC呼び出し規約を使用することを、目に見える問題なしに阻止するようには見えません。
一方、stdcall
呼び出し規約は明確に定義されているようです。私が聞いたところによると、これはWin32とCOMで使用される規則であるため、すべてのWindowsコンパイラは基本的にそれに従う必要があります。これは、Win32 / COMをサポートしていないWindowsコンパイラはあまり役に立たないという仮定に基づいています。フォーラムに投稿された多くのコードスニペットは関数を宣言していますがstdcall
、理由を明確に説明する単一の投稿を見つけることができないようです。
矛盾する情報が多すぎて、実行する検索ごとに異なる回答が得られるため、2つを判断するのに役立ちません。なぜどちらかを選択する必要があるのか(または2つが同等である理由)について、明確で詳細な議論のある説明を探しています。
ほとんどのクライアントコードは、「インターフェース」、純粋仮想クラス(次のパターンは、例えば説明を通じて、私のDLLとのインタフェースになるので、この質問は、「古典的な」機能に、だけでなく、仮想メンバ関数の呼び出しに適用されるだけでなく、注意こことそこ)。