0

最近、インターネット上のランダムなソースをブラウズしているときに、いくつかの興味深いマクロを見つけました。

#define CWA(dll, api)                 ::api

誰かがそのマクロとは何か、それを機能させるために他に何が必要かを説明できますか? これが使用されている例を次に示します。

CWA(user32, MessageBoxW)(NULL, L"Hello world!", NULL, MB_OK);

APIなどに特定のインポートタイプを使用するようにコンパイラ/リンカーに指示していたと思います....

前もって感謝します。

4

1 に答える 1

4

プリプロセッサ言語は非常に読みやすいです。あなたはマクロを持っています:

#define CWA(dll, api) ::api

コードで使用されます:

CWA(user32, MessageBoxW)(NULL, L"Hello world!", NULL, MB_OK);

したがって、前処理の結果は次のようになります。

::MessageBoxW(NULL, L"Hello world!", NULL, MB_OK);

「api」はマクロの 2 番目の引数にすぎないため、基本的にマクロには 2 つの引数があることに注意してください。1 番目は無視され、2 番目はグローバル関数の名前です (:: はグローバル関数を呼び出すためのプレフィックスです。例: ::MyGlobalFunc)。

最初の引数 "dll" は無視されるため、関数がどの dll であるかのコメントとして機能します。

編集:その背後にある考えられる理由-誰かが他のDLLへのグローバル関数への呼び出しを明確に文書化したい. 「user32.dll から関数 MessageBoxW を呼び出しています」とうまく表示されます。

于 2012-07-21T14:47:26.483 に答える