Макросы и Visual C ++ - PullRequest
       20

Макросы и Visual C ++

0 голосов
/ 17 марта 2009

Я пытаюсь лучше понять, какое место (если оно есть) у макросов в современных C ++ и Visual C ++, также со ссылкой на библиотеки программирования Windows: какие проблемы (если таковые имеются) делают макросы решить в этих ситуациях, что не может быть решено без их использования?

Я помню, как читал об использовании 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, но я также пытаюсь найти лучшие практики для написания или избегания макросов и где / когда их использовать.

Ответы [ 3 ]

3 голосов
/ 17 марта 2009

Питер, вы могли бы также спросить, является ли vi или EMACS лучшим редактором. (EMACS, между прочим.) Многие люди считают препроцессор C ужасной идеей; Страуструп и Джим Гослинг среди них. Вот почему у Java нет препроцессора, и есть бесчисленное множество вещей, которые Stroustrup поместил в C ++, от const до шаблонов, чтобы избежать использования препроцессора.

Есть другие люди, которым удобно добавлять новый язык, как в этом коде.

Если вы прочитаете оригинальный код оболочки Bourne, вы обнаружите, что он выглядит как

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

Стив Борн в основном использовал макросы, чтобы придать ему вид, похожий на Algol68 (тогда это был действительно классный язык). С кем-то, кроме Стива Борна, работать может быть очень сложно.

Затем взгляните на конкурс «Запутанный С», где некоторые из самых удивительных запутываний используют преимущества #define.

Лично я не особо возражаю, хотя этот пример немного устрашает (как вы отлаживаете это?), Но работа такого рода работает без сети; там не так много валенд.

3 голосов
/ 17 марта 2009

Все эти макросы определены в общедоступных заголовочных файлах SDK, так что вы можете прочитать, что они делают сами, если хотите. В основном здесь происходит генерация функции WndProc с использованием макросов. Каждая запись MSG_WM_ * является оператором case, который обрабатывает данное оконное сообщение, переводя его аргументы из wParam и lParam в их исходные типы и вызывая вспомогательную функцию (которую вы затем реализуете), которая принимает эти типы в качестве аргументов (при необходимости некоторые оконные сообщения имеют 0 или 1 аргумент).

На мой взгляд, все это дерьмо. Вы тратите время на то, чтобы заранее написать кучу котлов, но взамен вы потом усложняете отладку. Макросам не место в моем современном мире программирования, кроме как проверить, определены они или нет. Макросы, которые управляют потоком данных или предполагают, что определенные локальные переменные всегда определены и т. Д., Делают меня совершенно несчастным. Особенно, когда я должен их отладить.

1 голос
/ 17 марта 2009

(Вопрос несколько фрагментирован, но игнорируется часть Windows):

X-Macros используйте препроцессор, чтобы избежать дублирования кода.

...