الدرس 53: توجيهات المعالج المسبق المتقدمة (الترجمة الشرطية)
تسمح الترجمة الشرطية (Conditional compilation) للمبرمج بتضمين أو استبعاد كتل معينة من الكود بناءً على شروط محددة مسبقاً (macros). هذا أمر بالغ الأهمية للقابلية للنقل، وتصحيح الأخطاء، وإدارة إعدادات البناء المختلفة.
1. #ifdef و #ifndef
#ifdef identifier: يتحقق مما إذا كان الماكروidentifierقد تم تعريفه.#ifndef identifier: يتحقق مما إذا كان الماكروidentifierلم يتم تعريفه.
مثال: تبديل وضع تصحيح الأخطاء (Debug)
c #include <stdio.h>
#define DEBUG // تعريف DEBUG عالمياً
int main() { int data = 42; printf("البرنامج يعمل.\n");
#ifdef DEBUG
// سيوجد هذا الكود فقط إذا تم تعريف DEBUG
printf("[DEBUG] قيمة البيانات هي: %d\n", data);
#endif
printf("انتهى البرنامج.\n");
return 0;
}
2. #if, #elif, و #else
يتحقق مما إذا كان التعبير الصحيح الثابت يعطي نتيجة صحيحة (غير صفرية).
c #define OS_TYPE 1 // 1 لـ Linux، و 2 لـ Windows
#if OS_TYPE == 1 #include <unistd.h> #define SYSTEM_NAME "Linux" #elif OS_TYPE == 2 #include <windows.h> #define SYSTEM_NAME "Windows" #else #define SYSTEM_NAME "Unknown" #endif
int main() { printf("يتم الترجمة لنظام %s\n", SYSTEM_NAME); return 0; }
3. حراس الرأس (منع التضمين المتعدد)
تُستخدم الترجمة الشرطية في ملفات الرأس لضمان تضمين محتويات الملف مرة واحدة فقط، مما يمنع أخطاء إعادة التعريف.
c // في ملف myheader.h #ifndef MYHEADER_H #define MYHEADER_H
// محتوى ملف الرأس
#endif // MYHEADER_H