1. ホーム
  2. c

[解決済み] stdcallとは何ですか?

2022-04-24 20:42:14

質問

Win32のプログラミングを勉強しているのですが、その中で WinMain のプロトタイプのようなものです。

int WINAPI WinMain ( HINSTANCE instance, HINSTANCE prev_instance, PSTR cmd_line, int cmd_show )

私は、この WINAPI の識別子があり、それを見つけた。

#define WINAPI      __stdcall

これは何をするものなのでしょうか? このように戻り値の後に全く何もないのは困惑します。 これは何ですか? __stdcall のために? 戻り値の型と関数名の間に何かあるのはどういう意味ですか?

どのように解決するのですか?

__stdcall は、その関数に使用される呼び出し規約です。 これは、スタックのセットアップ、引数のプッシュ、戻り値の取得に適用されるルールをコンパイラに伝えるものです。

このほかにも、さまざまな呼び出し規約があります。 __cdecl , __thiscall , __fastcall という素晴らしい名前の __declspec(naked) . __stdcall は、Win32システムコールの標準的な呼び出し規則です。

ウィキペディアでは 詳細 .

主に、自分のコードの外の関数(例えばOSのAPI)を呼び出す場合や、OSが自分を呼び出す場合(ここではWinMainの場合)などに問題となります。 コンパイラが正しい呼び出し規則を知らない場合、スタックが正しく管理されないため、非常に奇妙なクラッシュが発生する可能性があります。