7

さまざまな呼び出し規約を使用する際の主な要因は何ですか?誰かが、__cdeclまたは__stdcallまたは__fastcallさまざまな機会に特定の呼び出し規約を使用することを知っているのはいつですか。

例は本当に評価されるでしょう。

4

1 に答える 1

16

ほとんどの場合、それについて心配する必要はありません。通常はを使用しますが__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' #defined as __stdcall)。これが必要なのは、オペレーティングシステムが、規則を使用するを指すことを想定しているためlpfnWndProcです。WNDPROCCALLBACK

コールバックを受け入れるほぼすべてのWindowsAPI関数では、コールバック関数が__stdcall規則を使用する必要__cdeclがあります。通常はデフォルトであるため、これを明示的にする必要があります(CALLBACKウィンドウプロシージャに使用します)。

__stdcallオペレーティングシステムが非関数を呼び出そうとするとスタックが破損する可能性があるため、これは非常に重要です。残念ながら、十分な数の人々がこれを誤解しているため、Windowsは、特にウィンドウプロシージャの呼び出し規約の不一致を実際にチェックします

__stdcallWinAPI関数に渡されるコールバック関数には必須ですが、可変数の引数を受け入れる関数は呼び出し規約を使用する必要があります。__cdeclこれは、呼び出し側だけが可変数の引数をスタックから適切にポップする方法を知っているためです。通常はがデフォルトであるため、可変数の引数を受け入れる関数__cdeclを明示的に指定する必要はありません。__cdecl

__fastcall誰かが持っていると確信していますが、私は個人的にの使用法を見つけていません。

__clrcallマネージコードを操作している場合にのみ関係します。

于 2010-08-04T11:43:33.347 に答える