الترجمة الشرطية
ifdef والماكروهات
الترجمة الشرطية درس مجاني في C Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C Academy 4 دروس في المجموع.
المعالج القبلي
يعمل المعالج القبلي قبل أن يرى المصرّف شيفرتك أصلًا. ويتعامل مع كل سطر يبدأ بالرمز #: التضمينات ووحدات الماكرو والشروط.
يتيح التصريف الشرطي تضمين كتل من الشيفرة أو استبعادها بناءً على شروط تُقيَّم في هذه المرحلة، مما ينتج إصدارات مختلفة من مصدر واحد.
تعريف وحدات الماكرو
ينشئ #define وحدة ماكرو. وإذا لم تُحدَّد لها قيمة، فهي مجرد علامة يمكنك اختبارها لاحقًا.
تستبدل وحدات الماكرو الشبيهة بالكائنات اسمًا بنص؛ أما العلامات فتشير ببساطة إلى أن شيئًا ما معرّف.
#define MAX_USERS 100 /* value macro */
#define DEBUG /* flag macro */ifdef و ifndef
يُبقي #ifdef NAME الكتلة فقط إذا كان NAME معرّفًا. ويُبقي #ifndef الكتلة فقط إذا لم يكن معرّفًا.
هنا لا تكون طباعة التصحيح موجودة إلا في إصدارات التصحيح. ومن دون تعريف DEBUG، لا يرى المصرّف ذلك السطر أصلًا.
#include <stdio.h>
#define DEBUG
int main(void) {
#ifdef DEBUG
printf("debug: starting\n");
#endif
printf("running\n");
return 0;
}if و elif و else
يقيّم #if تعبيرًا صحيحًا ثابتًا. ادمجه مع #elif و#else للاختيار من عدة مسارات.
يختار هذا الشيفرة استنادًا إلى وحدة ماكرو تمثل رقم إصدار.
#include <stdio.h>
#define VERSION 2
int main(void) {
#if VERSION >= 2
printf("new feature on\n");
#else
printf("legacy mode\n");
#endif
return 0;
}المعامل defined
يمكنك داخل #if اختبار التعريف باستخدام defined(NAME)، ودمج الاختبارات باستخدام && و||.
وهذا أكثر مرونة من #ifdef، الذي لا يستطيع اختبار سوى اسم واحد.
#if defined(LINUX) && !defined(EMBEDDED)
/* desktop Linux code */
#endifالتعريف في وقت التصريف
لا يتعين عليك تضمين وحدات الماكرو في الشيفرة. إذ يعرّفها الخيار -D في سطر الأوامر.
هكذا تبدّل أنظمة البناء الميزات من دون تعديل المصدر. ويعادل -DDEBUG كتابة #define DEBUG في أعلى كل ملف.
gcc -DDEBUG -DVERSION=3 -o app app.cاكتشاف المنصة
يعرّف المصرّفون مسبقًا وحدات ماكرو تصف النظام المستهدف. وتستخدمها لكتابة شيفرة قابلة للنقل.
_WIN32— Windows (32 أو 64 بت)__linux__— Linux__APPLE__— macOS / iOS
استخدم هذه الشروط لاستدعاء واجهة برمجة التطبيقات المناسبة للمنصة.
#ifdef _WIN32
#include <windows.h>
#else
#include <unistd.h>
#endifحواجز تضمين ملفات الترويسة
الاستخدام التقليدي للشروط هو حاجز التضمين، الذي يمنع معالجة ملف الترويسة مرتين.
يعرّف أول تضمين وحدة ماكرو الحاجز؛ أما التضمينات اللاحقة فتتجاوز المحتوى لأن وحدة الماكرو معرّفة مسبقًا.
#ifndef UTILS_H
#define UTILS_H
int add(int a, int b);
#endif /* UTILS_H */تعطيل الشيفرة بالتعليق
يعطّل #if 0 ... #endif كتلةً بشكل موثوق، حتى لو كانت تحتوي أصلًا على تعليقات.
وخلافًا لـ /* */، فهو يتعامل بأمان مع التداخل، ولذلك يُعد الطريقة القياسية لاستبعاد الشيفرة مؤقتًا أثناء تصحيح الأخطاء.
#if 0
legacy_function(); /* disabled for now */
/* with internal comments too */
#endifفحص ناتج المعالج القبلي
لمعرفة ما سيصرّفه المصرّف بالضبط، شغّل المعالج القبلي وحده باستخدام -E.
يوسّع هذا الخيار كل التضمينات ووحدات الماكرو والشروط، وهو مفيد جدًا عندما تتصرف وحدة ماكرو بشكل غير صحيح.
gcc -E app.c | lessمفاتيح الميزات عمليًا
من الأنماط الشائعة استخدام ملف ترويسة واحد للإعدادات، يفعّل الميزات أو يعطّلها للمشروع بأكمله.
غيّر تعريف #define واحدًا، فتستجيب كل الكتل المحمية في جميع الملفات. وهذا يحافظ على فصل الميزات الاختيارية عن الشيفرة الأساسية بطريقة واضحة.
#include <stdio.h>
#define FEATURE_LOGGING 1
int main(void) {
#if FEATURE_LOGGING
printf("logging enabled\n");
#endif
printf("app ready\n");
return 0;
}تحقق سريع
توقّع سلوك تعريف يُمرَّر عبر سطر الأوامر.
مراجعة
أصبحت الآن تتحكم في التصريف الشرطي:
- يختبر
#ifdef/#ifndefما إذا كانت وحدة ماكرو معرّفة - يقيّم
#if/#elif/#elseتعبيرات ثابتة، معdefined() - يعرّف
-DNAMEوحدات الماكرو من سطر الأوامر لتبديل الميزات - تتيح وحدات ماكرو المنصة المعرّفة مسبقًا كتابة شيفرة قابلة للنقل، وتمنع حواجز التضمين التضمين المزدوج
التالي: تنظيم الشيفرة عبر ملفات متعددة.
الأسئلة الشائعة
هل درس «الترجمة الشرطية» مجاني؟
نعم — نص درس «الترجمة الشرطية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C Academy 4 دروس في المجموع.
ماذا ستتعلم في «الترجمة الشرطية»؟
ifdef والماكروهات تتمرن على C Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C Academy؟
لا تُشترط خبرة سابقة. C Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «الترجمة الشرطية»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C Academy هذا؟
نعم. كل درس في C Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الترجمة الشرطية
- مشاريع متعددة الملفات
- Makefiles
- المكتبات الساكنة والمشتركة