الدرس 26: توجيهات المعالج المسبق (الجزء 1)
المعالج المسبق هو المرحلة الأولى من عملية الترجمة. يقرأ كود المصدر ويقوم باستبدالات نصية معينة قبل أن يرى المترجم الفعلي الكود. تبدأ التوجيهات برمز #.
1. توجيه #include
يُستخدم لتضمين محتوى ملف آخر (عادة ملف رأس) في الملف الحالي.
أ) رؤوس المكتبة القياسية
تستخدم الأقواس الزاوية (<>) للبحث في مجلدات النظام المحددة مسبقاً.
c #include <stdio.h> #include <math.h>
ب) رؤوس معرفة من قبل المستخدم
تستخدم علامات الاقتباس المزدوجة ("") للبحث في مجلد المصدر الحالي أولاً.
c #include "my_utility.h"
2. توجيه #define (Macros)
يُستخدم لتعريف ثوابت رمزية (ماكرو). أينما يتم استخدام المعرف في الكود، يقوم المعالج المسبق باستبداله بالنص المحدد.
أ) تعريف ثوابت بسيطة
c #define MAX_SIZE 100
int array[MAX_SIZE]; // تُستبدل بـ int array[100];
ب) تعريف ماكرو يشبه الدوال
يمكن للماكرو قبول وسائط. إنها تؤدي استبدالاً نصياً، وليس استدعاء دوال فعلي (مما يقلل العبء الناتج عن استدعاء الدوال).
c // تحذير: الماكرو مجرد استبدال نصي بسيط ويمكن أن يؤدي لآثار جانبية! #define SQUARE(x) (x * x)
int y = SQUARE(5); // y = (5 * 5) -> 25
// مثال سيء: SQUARE(a++) تصبح (a++ * a++)، مما ينفذ a++ مرتين.
أفضل ممارسة: ضع دائماً وسائط الماكرو والتعريف نفسه بين أقواس لمنع مشاكل الأسبقية.