أخي،
الماكرو في ال ++C هو عبارة عن تصريح DEFINE وقد يكون له بارامترات أو لا يكون . وكما تعلم فإنك إذا عرقت define في برنامجك لتصريح ما مثل :
[code2]
#define MY_VAL 10
[/code2]
فإن المترجم أثناء عملية الترجمة يقوم باستبدال أي كلمة يجدها MY_VAL بالقيمة 10
الماكرو نفس الموضوع . مثلا أنت تريد أن تكتب ماكرو يطبع الكلمة Test على الشاشة فيكون كالتالي :
[code2]
#define PRINT() printf(“Test”)
[/code2]
وبالتالي عندما تكتب بعد ذلك في البرنامج العبارة
PRINT(); فإن المترجم يحل محلها العبارة :
[code2]
Printf(“Test”);
[/code2]
أما الماكروات ذات البارامترات فهي الأكثر انتشارا .. وهي مقيدة جدا .. مثلا تريد كتابة ماكرة من أجل ارجاع القيمة الأصغر بين قيمتين فيكون :
[code2]
#define MIN(a,

(a < b ? a :
[/code2]
الآن كلما يجد المترجم العبارة MIX( 1, 2) مهما تكن البارامترات فإنه يستبدلها ب :
(1 < 2 ? 1 : 2) ..
بالنسبة لل MFC فيجود العديد من الماكروات التي تسهل من البرمجة ومنها كما ذكرت BEGIN_MESSAGE_MAP وغيرها وهذه الماكروات ليست بسيطة أي قد تجدها تمتد إلى عدة أسطر وممكن أن تبحث عنها في شيقرة ال MFC المفتوحة وتقرئها .. أكثر هذه الماكروات موجودة في الملف afxwin.h . وعلى سبيل المثال ترى أن DECLARE_MESSAGE_MAP معرفة على الصورة :
[code2]
#define DECLARE_MESSAGE_MAP()
private:
static const AFX_MSGMAP_ENTRY _messageEntries[];
protected:
static AFX_DATA const AFX_MSGMAP messageMap;
virtual const AFX_MSGMAP* GetMessageMap() const;
[/code2]
ملاحظة : علامة الهروب () المستخدمة بعد انتهاء كل سطر في الماكرو تخبر المترجم أن السطر الذي يلي هو تابع للماكرو .
بالنسبة لشرح ماكروات الرسائل في ال MFC فسوف أفصل في ذلك في الدرس بعد القادم في سلسلة تعليم الفيجوال سي ...
طبعا فائدة الماكرو هي :
- الاختصار في وقت كتابة الأكواد الي تستعملها باستمرار وبكثرة
- تخفيف تعقيد بعض العبارات
- طبعا بعض الأحيان يمكن كتابة روتين يؤدي الغرض ولكن الماكرو أسرع لأنه لا يحتاج إلى مناداة التابع . وهي تشبه ال inline في عملها
ولكن استخدام الماكروات الكبيرة بكثرة قد تؤدي إلى زيادة حجم الكود ..