さまざまな呼び出し規約を使用する際の主な要因は何ですか?誰かが、__cdecl
または__stdcall
または__fastcall
さまざまな機会に特定の呼び出し規約を使用することを知っているのはいつですか。
例は本当に評価されるでしょう。
さまざまな呼び出し規約を使用する際の主な要因は何ですか?誰かが、__cdecl
または__stdcall
または__fastcall
さまざまな機会に特定の呼び出し規約を使用することを知っているのはいつですか。
例は本当に評価されるでしょう。
ほとんどの場合、それについて心配する必要はありません。通常はを使用しますが__cdecl
、これはVisualC++のデフォルトであるためです。ただし、C ++メンバー関数は、VisualC __thiscall
++ではデフォルトで規則を使用します
呼び出し規約について本当に心配しなければならない(かなり一般的な)状況は、WindowsAPIのようなAPI関数にコールバックを渡すときです。
// CALLBACK is #define'd as __stdcall
LRESULT CALLBACK MyWndProc(HWND hwnd, UINT msg
WPARAM wParam, LPARAM lParam);
// ...
windowClass.lpfnWndProc = &MyWndProc;
::RegisterClass(&windowClass);
ここではMyWndProc()
、__stdcall
規則があることを宣言します(CALLBACK
' #define
d as __stdcall
)。これが必要なのは、オペレーティングシステムが、規則を使用するを指すことを想定しているためlpfnWndProc
です。WNDPROC
CALLBACK
コールバックを受け入れるほぼすべてのWindowsAPI関数では、コールバック関数が__stdcall
規則を使用する必要__cdecl
があります。通常はデフォルトであるため、これを明示的にする必要があります(CALLBACK
ウィンドウプロシージャに使用します)。
__stdcall
オペレーティングシステムが非関数を呼び出そうとするとスタックが破損する可能性があるため、これは非常に重要です。残念ながら、十分な数の人々がこれを誤解しているため、Windowsは、特にウィンドウプロシージャの呼び出し規約の不一致を実際にチェックします。
__stdcall
WinAPI関数に渡されるコールバック関数には必須ですが、可変数の引数を受け入れる関数は呼び出し規約を使用する必要があります。__cdecl
これは、呼び出し側だけが可変数の引数をスタックから適切にポップする方法を知っているためです。通常はがデフォルトであるため、可変数の引数を受け入れる関数__cdecl
を明示的に指定する必要はありません。__cdecl
__fastcall
誰かが持っていると確信していますが、私は個人的にの使用法を見つけていません。
__clrcall
マネージコードを操作している場合にのみ関係します。