13

重複の可能性:
C の「CALLBACK」宣言は何をしますか?

WindowProc() 関数のプロトタイプはこれです

LRESULT CALLBACK WindowProc(HWND hWnd,UINT message , WPARAM wParan, LPARAM lParam);

しかし、私は CALLBACK キーワードに出くわしたことはありません。コールバック関数とは、別の関数へのポインターを渡す関数であることだけを知っているので、この CALLBACK とは正確には何ですか? そしてそれは何をしますか?

4

1 に答える 1

13

__stdcallこれは、Win32 API がコールバック関数について想定しているため、#defined asです。これは呼び出し規則です。関数呼び出しが低レベルでどのように配置されるか、CPU スタックでパラメーターがどのように配置されるかなどを記述します。予想されるスタック レイアウトに関する仮定 (つまり、呼び出し規則) は、呼び出し元と呼び出し先の間で一致する必要があります。

歴史的に、Intel CPU には複数の呼び出し規約がありました。Microsoft 以外のコンパイラを数えると、さらに多くなります。C[++] 以外の言語を数えると、Windows API を呼び出したり呼び出したりすることができます。Windows API コールバックが__stdcallWinAPI の期待に一致するように明示的にマークされていることを確認することをお勧めします。場合によっては、コンパイラと設定に応じて、__stdcallがデフォルトの呼び出し規則になります (つまり、安全に CALLBACK を省略できます) が、常にそうとは限りません。

Win16 では、CALLBACK は として定義されていましfar pascalた。特にCプログラムでは、これがユーザー関数のデフォルトになる可能性はさらに低くなります。コールバックが Pascal 呼び出し規則を持っていると想定されていたという事実は、歴史的な成果物でした。また、マイクロ最適化としても機能しました。

于 2012-06-16T19:05:38.300 に答える