質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

意見交換

クローズ

1回答

540閲覧

__stdcallと__cdeclの使い分けについて

jmdajmw

総合スコア346

DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2024/10/18 05:52

0

0

テーマ、知りたいこと

__stdcallと__cdeclの違いというかなんでこんなに紛らわしいものがあるんですか?

背景、状況

今作っているシステムの3号機において__stdcallと__cdeclの不一致が原因のアプリケーションエラーが発生しました。
1号機、2号機では問題なく動作していたもののソースコードを見直すと__stdcallと__cdeclがごちゃごちゃに混在しており、逆に今まで正常に動作していたことが不思議なくらいです。
1号機2号機も遡って修正版をインストールしなくてはなりません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

回答1

#1

SaitoAtsushi

総合スコア5675

投稿2024/10/18 07:13

歴史的な事情が色々とあって結果的に複数の呼び出し規約が存在しているとしか言えないのですが重要な理由のひとつとして C には関数原型 (プロトタイプ) のない関数というものがあるというのが関係していると思います。

要は関数の引数の型がわからない状態が存在しえて、それでも正しく呼び出せているなら正しく、間違ってても即座にクラッシュはしないくらいにはフォローできる仕組みが必要だったのです。 そのためには呼出し型でスタックに積んだ実引数の後始末をしたほうが確実です。 呼び出し側は実引数としてスタックに積んだ数 (スタックポインタが動いた量) を知っているのでそれを元に戻す方法も知っています。 これが cdecl です。

しかし、ローカル変数の後始末をするためにもスタックの調整はするのですからそのときに一緒に引数の後始末 (スタックポインタの書換) も出来れば効率は良いです。 引数の内容がきちんとわかっていてズレる心配がないならこちらのほうが好都合です。 これが stdcall です。

通常では C や C++ で書かれたプログラムでは特に指定しなければ cdecl が使われるのでいちいち指定が必要な状況はあまり起こりません。 起こるとしたら、そのプロジェクト内で別の言語を混ぜて使っている (または過去に混ぜていたなごり) という事情が考えられます。

また、 Windows では DLL が外部に公開する関数は stdcall を使う慣例がありますが、静的リンクしていたものを DLL に分離したり、逆に DLL を静的リンクにするなどの変更があったときに混乱してしまったということもありうるでしょう。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

最新の回答から1ヶ月経過したため この意見交換はクローズされました

意見をやりとりしたい話題がある場合は質問してみましょう!

質問する

関連した質問