8

Win-32 C++ アプリケーションの一部の関数呼び出しにはCALLBACK、この例のようにキーワードが適用されています (この MSDN ページから取得)。

BOOL CALLBACK DeleteItemProc(HWND hwndDlg, UINT message,
                             WPARAM wParam, LPARAM lParam) 
{
    // ... code here ...
}

CALLBACKキーワードが ( を使用して#define) として定義されていることを Visual Studio で確認し__stdcallます。__stdcallのドキュメントでは、(少なくとも私には) それが何をするのかがあまり明確ではありません。

要するに、使用CALLBACKは私にとって何をしますか? それは絶対に必要ですか、それともその宣言を省略できますか?

4

3 に答える 3

27

必須です。ほとんどのコンパイラでは、__stdcall は既定の呼び出し規約ではありません。__cdecl が通常のデフォルトです。呼び出し規約が間違っていると、プログラムの動作が診断しにくくなります。引数の値が正しくなく、スタックが不均衡になります。

これは 32 ビット コードのみの問題であり、64 ビット コードには呼び出し規約が 1 つしかありません。もう 1 人追加した者は、南大西洋の小さな島に一生追放されることになります。__stdcall は、DOS および 16 ビット Windows でのパスカル呼び出し規則で始まった歴史的な事故です。当時は、使用可能なメモリが非常に少なかったため、呼び出しから命令を削除することが重要でした。

于 2013-02-28T02:38:32.933 に答える
2

CALLBACKはキーワードではありません。これは、適切な呼び出し規則に置き換えられる単なるプリプロセッサ マクロです__stdcall

これは "Pascal に似た" 呼び出し規則であり、可変数の引数をサポートせず、Win32 API で初期から使用されていましたが、歴史的な理由からまだ存在しています。

于 2013-02-28T02:49:43.407 に答える
0

CALLBACK__stdcallメカニズムとして定義されています。しかし、それ自体は、イベントの発生時に他の関数によって呼び出される関数です(たとえば)。

しなければならないのですか?はい!なんで?デフォルトは__cdecl

于 2013-02-28T02:36:00.930 に答える