العودة إلى الدورة

توجيهات المعالج المسبق (الجزء 1: #include و #define)

لغة C: من الصفر إلى الاحتراف - الدليل الشامل للمبتدئين

الدرس 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++ مرتين.

أفضل ممارسة: ضع دائماً وسائط الماكرو والتعريف نفسه بين أقواس لمنع مشاكل الأسبقية.