وظائف الماكرو في C++

Wzayf Almakrw Fy C



في برمجة C++، تعد وظائف الماكرو أداة قوية لتعزيز مرونة التعليمات البرمجية وكفاءتها. يعمل الماكرو كعنصر نائب داخل التعليمات البرمجية المصدر، ويستبدله بالقيمة المقابلة له بواسطة المعالج المسبق قبل عملية الترجمة الفعلية. تتم تهيئة وحدات الماكرو باستخدام الأمر #define، ويمكن إزالتها باستخدام الأمر #undef. تعمل وحدات الماكرو هذه على تمكين المطورين من تحديد مقتطفات التعليمات البرمجية القابلة لإعادة الاستخدام، وتبسيط المهام المتكررة بسهولة. تتعمق هذه المقالة في تفاصيل وظائف الماكرو، وتسلط الضوء على خصائصها وحالات الاستخدام والمزايا المحتملة.

ما هي وظيفة الماكرو؟

دالة الماكرو هي مكون صغير قابل لإعادة الاستخدام من كود C++ مكتوب باستخدام التوجيه #define. يعمل الماكرو كآلية لاستبدال النص حيث يتم استبدال أي تواجد لاسمه داخل التعليمات البرمجية بكتلة التعليمات البرمجية المحددة الخاصة به أثناء مرحلة المعالجة المسبقة. تعد وظائف الماكرو مفيدة بشكل خاص للتعامل مع المهام المتكررة والعمليات ذات المعلمات والتعليمات البرمجية التي تتطلب التكيف مع سيناريوهات مختلفة.







بناء جملة وظيفة الماكرو:

يتضمن بناء الجملة لتعريف دالة ماكرو استخدام التوجيه #define متبوعًا باسم الماكرو وقائمة المعلمات (إن وجدت) وكتلة التعليمات البرمجية. إليك مثال أساسي:



# تعريف صقر ( مربع ) ( ( مربع ) * ( مربع ) )



في هذا المثال، 'Squre' هي دالة ماكرو تأخذ معلمة واحدة 'sq' وتحسب مربعها. تضمن الأقواس المزدوجة التقييم الصحيح، خاصة عندما تتضمن المعلمة تعبيرات.





الآن، دعنا ننتقل إلى قسم الأمثلة لمعرفة متى يتم استخدام وظيفة الماكرو في برنامج C++.

تطبيقات وظائف ماكرو C++

تتمتع وظائف الماكرو بأهمية عبر سيناريوهات البرمجة المختلفة، مما يوفر للمطورين أداة متعددة الاستخدامات لتحسين التعليمات البرمجية وتبسيطها. دعنا نستكشف بعض حالات الاستخدام المقنعة التي تسلط الضوء على فعالية وظائف الماكرو في لغة C++.



السيناريو 1: إمكانية إعادة استخدام الكود

تتفوق وظائف الماكرو في السيناريوهات التي يتم فيها تكرار نمط تعليمات برمجية معين عبر البرنامج. من خلال تغليف التعليمات البرمجية في الماكرو، يمكن للمطورين إعادة استخدامها دون عناء، وتعزيز رمز أكثر نظافة وأكثر قابلية للصيانة. في البرنامج التالي، سوف نستخدم دالة الماكرو لحساب مجاميع متعددة من الأرقام المعطاة. دعونا نرى الكود أولاً ثم نشرحه بالتفصيل:

#تشمل

استخدام اسم للمحطة؛



#define ADD(ab, yz) ((ab) + (yz))



انت مين ( ) {



int sum1 إضافة ( 9 , 3 ) ;

cout << 'مجموع 9 و 3 هو =' << sum1 << نهاية؛



int sum2 إضافة ( أحد عشر , 7 ) ;

cout << 'مجموع 11 و 7 هو =' << sum2 << نهاية؛



كثافة العمليات قرص مضغوط = 8 ، وس = 4 ;



int sum3 = ADD ( قرص مضغوط ، ث ) ;

cout << 'مجموع 8 و 4 هو =' << sum3 << نهاية؛



يعود 0 ;

}

يوفر ملف الرأس '#include ' وظائف لعمليات الإدخال والإخراج مثل cout وcin. يحدد '#define ADD(ab, yz) ((ab) + (yz))' دالة ماكرو تسمى ADD والتي تأخذ وسيطتين، 'ab' و'yz'. يستخدم الماكرو توجيه المعالج المسبق وهو #define لاستبدال أي تواجد لـ ADD(ab, yz) بالتعبير الفعلي (ab) + (yz) أثناء الترجمة. نقطة دخول البرنامج، حيث يبدأ تنفيذ التعليمات البرمجية، هي “int main()”.

باستخدام الماكرو ADD، نحسب مجموعين: أحدهما هو 9 و3 والآخر هو 11 و7. نقوم بتمرير الأرقام مباشرة إلى الماكرو ADD لهذين المجموعين. أما بالنسبة للمجموع الثالث، فنمرر الرقم باستخدام المتغيرات. يتم تخزين الأرقام 8 و4 في المتغيرات 'cd' و'wx'، على التوالي، والتي يتم تمريرها لاحقًا إلى الماكرو ADD.

'int sum1 = ADD(9, 3);' يعين السطر مجموع 9 و 3 للمتغير 'sum1'. يتم استبدال الماكرو ADD(9, 3) بـ 9 + 3 أثناء التجميع مما يؤدي إلى قيمة 8 مخزنة في 'sum1'. 'int sum2 = ADD(11, 7);' يوضح السطر إعادة استخدام الماكرو مع وسائط مختلفة. في 'sum2'، يتم الاحتفاظ بمجموع 11 و7.

وأخيرًا، 'int cd = 8, wx = 4; int sum3 = ADD(cd, wx);' يظهر المثال باستخدام الماكرو مع المتغيرات. يتم استخدام قيم 'cd' و'wx' كوسائط لـ ADD مما يؤدي إلى تعيين المجموع في 'sum3'. هنا هو الإخراج:

كما ترون في هذا المثال، تأخذ وظيفة الماكرو ADD معلمتين. يقوم بتنفيذ عملية الإضافة، ويعرض استخدامه بقيم ومتغيرات مختلفة، ويطبع النتائج على وحدة التحكم. باستخدام وظيفة الماكرو هذه، يمكننا بسهولة إعادة استخدام منطق الإضافة في جميع أنحاء البرنامج. يؤدي هذا إلى تعزيز كود أكثر نظافة وقابلية للصيانة، خاصة عندما تكون عملية الإضافة نفسها مطلوبة في مواقع متعددة.

السيناريو 2: العمليات ذات المعلمات

تأتي وظائف الماكرو مع معلمات تسمح للمطورين بإنشاء رمز عام قادر على التكيف مع قيم الإدخال المختلفة. وهذا مفيد بشكل خاص للعمليات التي يجب تنفيذها باستخدام معلمات متغيرة. دعونا نرى المثال التالي:

#تشمل

استخدام اسم للمحطة؛



#define MAXI(ab, yz) ((ab) > (yz) ? (ab) : (yz))



انت مين ( ) {



int max1 = MAXI ( 9 , 3 ) ;

cout << الحد الأقصى 1 << 'هو الحد الأقصى بين 9 و 3' << endl << نهاية؛



كثافة العمليات = 12 , شارع = 9 ;

int max2 = MAXI ( كوالالمبور، ش ) ;

cout << الحد الأقصى 2 << ' هو الحد الأقصى بين ' << في << ' و ' << شارع << endl << نهاية؛



int max3 = MAXI ( 3 * كوالالمبور، الأربعاء + 5 ) ;

cout << max3 << ' هو الحد الأقصى بين 3 * ' << في << ' و ' << شارع << '+5' << نهاية؛



يعود 0 ;

}



تعريف الماكرو: #define MAXI(ab, yz) ((ab) > (yz) ? (ab) : (yz))

يحدد هذا السطر دالة ماكرو تسمى MAXI تأخذ معلمتين، 'ab' و'yz'، وتقوم بإرجاع الحد الأقصى للقيمتين باستخدام عامل التشغيل الثلاثي.

باستخدام دالة الماكرو مع الثوابت، int max1 = MAXI(9, 3)، نحسب الحد الأقصى للعدد بين 9 و3، ويتم تخزين النتيجة في 'max1'. ثم يتم عرض النتيجة على وحدة التحكم.

باستخدام دالة الماكرو مع متغيرات 'kl' و'st'، يتم تخزين رقمين في هذه المتغيرات، ثم يتم تمريرهما إلى دالة الماكرو MAXI للعثور على الحد الأقصى للعدد بينهما. يتم إعادة استخدام دالة الماكرو مع المتغيرات 'kl' و'st' مما يوضح أنها تعمل مع كل من الثوابت والمتغيرات. يتم تطبيق وظيفة الماكرو على التعبير (3 * kl وst + 5)، مما يوضح قدرتها على التكيف مع أنواع الإدخال المختلفة. عند تشغيل هذا الكود، يجب أن تشاهد مخرجات مثل ما يلي:

في المثال الموضح، تحدد دالة الماكرو MAXI الحد الأقصى للقيمة بين رقمين. توضح الوظيفة الرئيسية استخدام هذا الماكرو مع القيم الثابتة والمتغيرات وحتى التعبيرات. ثم يتم عرض النتيجة على وحدة التحكم. يوضح هذا كيف تتكيف وظيفة الماكرو MAXI مع قيم الإدخال والتعبيرات المختلفة، مما يوفر آلية عامة للعثور على القيمة القصوى.

السيناريو 3: التجميع الشرطي

تلعب وحدات الماكرو دورًا أساسيًا في تشغيل أجزاء معينة من التعليمات البرمجية أو إيقاف تشغيلها أثناء الترجمة. يعد هذا مفيدًا لدمج رمز خاص بالنظام الأساسي أو إدارة تبديل الميزات.

#تشمل

#تعريف DEBUG_MODE

انت مين ( ) {
#ifdef DEBUG_MODE
الأمراض المنقولة جنسيا::كوت << 'مرحبًا كلسوم! تم تمكين وضع التصحيح.' << ستد::endl;
#إنهاء إذا

يعود 0 ;
}

في هذا المثال، يحدد السطر '#define DEBUG_MODE' ماكرو يسمى DEBUG_MODE. إذا كان هذا السطر بدون تعليق، فهذا يعني أن وضع التصحيح ممكّن. إذا تم التعليق عليه، فسيتم تعطيل وضع التصحيح. يتحقق التوجيه '#ifdef DEBUG_MODE' من تحديد ماكرو DEBUG_MODE. إذا تم تعريفه (بدون تعليق)، فسيتم تضمين التعليمات البرمجية الموجودة في #ifdef و#endif أثناء التجميع. إذا لم يتم تعريفه (التعليق عليه)، فسيتم استبعاد هذا الجزء من الكود.

تعتبر تقنية الترجمة الشرطية هذه فعالة لإدارة تنوعات التعليمات البرمجية بناءً على إعدادات الترجمة المختلفة. يتم استخدامه بشكل شائع لتصحيح الأخطاء حيث يتم تضمين رمز خاص بالتصحيح عند الحاجة فقط، ويمكن تشغيله أو إيقاف تشغيله بسهولة عن طريق تحديد الماكرو ذي الصلة أو التعليق عليه. انظر الإخراج التالي:

كما ترون، تم تنفيذ الكود الموجود بين #ifdef و #endif وطباعته على وحدة التحكم، مما يعرض رسالة 'Hey, Kalsoom! تم تمكين وضع التصحيح '. تعمل وظائف الماكرو على تبسيط عملية إجراء تغييرات متسقة عبر قاعدة التعليمات البرمجية. إذا كان التعديل مطلوبًا، فإن تغيير تعريف الماكرو يضمن تطبيق التغيير بشكل موحد أينما يتم استخدام الماكرو.

خاتمة

في الختام، وظائف الماكرو في C++ تقدم آلية قوية لتعزيز مرونة التعليمات البرمجية وكفاءتها. يمكن للمطورين الاستفادة من التوجيه #define لتغليف كتل التعليمات البرمجية وتعزيز إمكانية إعادة الاستخدام وتبسيط المهام المتكررة. إن فهم بناء جملة وظائف الماكرو وحالات الاستخدام والمزايا يزود المبرمجين بأداة قيمة لتحسين قاعدة التعليمات البرمجية الخاصة بهم وتعزيز برنامج C++ أنظف وأكثر قابلية للصيانة. من خلال التطبيق المدروس والالتزام بأفضل الممارسات، تصبح وظائف الماكرو جزءًا لا يتجزأ من مجموعة أدوات المطور مما يساهم في كفاءة التعليمات البرمجية وقابلية الصيانة.