0

Windows プログラミング ライブラリを参照して、最新のC++ および Visual C++ でマクロがどのような場所 (存在する場合) を持っているかをよりよく理解しようとしています。それらを使用していますか?

このブログ投稿で、 Google Chrome のマクロ用の WTL の使用 (とりわけ) について読んだことを覚えています。それらは MFC でも使用されています。これは、そのブログ投稿のマクロの例です。可能であれば詳細:

// CWindowImpl
BEGIN_MSG_MAP(Edit)
  MSG_WM_CHAR(OnChar)
  MSG_WM_CONTEXTMENU(OnContextMenu)
  MSG_WM_COPY(OnCopy)
  MSG_WM_CUT(OnCut)
  MESSAGE_HANDLER_EX(WM_IME_COMPOSITION, OnImeComposition)
  MSG_WM_KEYDOWN(OnKeyDown)
  MSG_WM_LBUTTONDBLCLK(OnLButtonDblClk)
  MSG_WM_LBUTTONDOWN(OnLButtonDown)
  MSG_WM_LBUTTONUP(OnLButtonUp)
  MSG_WM_MBUTTONDOWN(OnNonLButtonDown)
  MSG_WM_MOUSEMOVE(OnMouseMove)
  MSG_WM_MOUSELEAVE(OnMouseLeave)
  MSG_WM_NCCALCSIZE(OnNCCalcSize)
  MSG_WM_NCPAINT(OnNCPaint)
  MSG_WM_RBUTTONDOWN(OnNonLButtonDown)
  MSG_WM_PASTE(OnPaste)
  MSG_WM_SYSCHAR(OnSysChar)  // WM_SYSxxx == WM_xxx with ALT down
  MSG_WM_SYSKEYDOWN(OnKeyDown)
END_MSG_MAP()

MSDN でマクロに関するこれらの 記事を読んだことがありますが、マクロの作成または回避のベスト プラクティスと、いつどこでマクロを使用するかについても取り上げようとしています。

4

3 に答える 3

3

これらのマクロはすべて、パブリック sdk ヘッダー ファイルで定義されているため、必要に応じてマクロの機能を自分で読むことができます。基本的にここで起こっていることは、マクロを使用して WndProc 関数を生成していることです。各 MSG_WM_* エントリは、引数を wParam および lParam から元の型に変換し、それらの型を引数として受け取るヘルパー関数 (後で実装します) を呼び出すことによって、指定されたウィンドウ メッセージを処理する case ステートメントです (必要に応じて—一部のウィンドウ メッセージには 0 または 1 つの引数があります)。

私の意見では、これはすべてがらくたです。前もって一連のボイラープレートを書かなければならないというトレードオフがありますが、その代わりに後でデバッグするのがはるかに難しくなります。私の最近のプログラミングの世界では、マクロが定義されているかどうかを確認する以外に、マクロの場所はあまりありません。フロー制御を行ったり、特定のローカル変数が常に定義されていると仮定したりするマクロは、私を非常に不幸にします。特にそれらをデバッグする必要がある場合。

于 2009-03-17T02:26:59.710 に答える
3

ピーター、vi と EMACS のどちらが優れたエディターかを尋ねた方がいいかもしれません。(ちなみに、EMACS です。) C プリプロセッサは恐ろしい考えだと考える人はたくさんいます。その中にはストラウストラップとジム・ゴズリング。constそのため、Java にはプリプロセッサがなく、Stroustrupがプリプロセッサの使用を避けるためにテンプレートから C++ に入れているものは無数にあります。

そのコードのように、新しい言語を追加できると便利だと思う人は他にもいます。

元の Bourne シェル コードを読むと、次のようになっていることがわかります。

IF a == b THEN
   do_something();
   do_more();
ELSE
   do_less();
FI

Steve Bourne は基本的にマクロを使用して、Algol68 のような外観を与えました (当時はそれが本当にクールな言語でした)。Steve Bourne 以外の誰かがこれを扱うのは非常に難しいかもしれません。

次に、難読化 C コンテストをご覧ください。最も驚くべき難読化のいくつかが#define.

個人的には、あまり気にしませんが、その例は少し難解です (どうやってデバッグしますか?)。そこには多くのワレンダがいません。

于 2009-03-17T02:33:09.243 に答える
1

(質問は断片的ですが、Windowsの部分は無視しています):

X-Macrosは、コードの重複を避けるためにプリプロセッサを使用します。

于 2009-03-17T02:32:05.893 に答える