C Academy · درس

ثوابت #define

استخدم ثوابت المعالج القبلي

الدرس 4 من 413 خطوة

ثوابت #define درس مجاني في C Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C Academy 4 دروس في المجموع.

ما يفعله ‎#define

إن #define توجيه للمعالج المسبق ينشئ ماكرو: اسمًا يستبدله المعالج المسبق بنص قبل الترجمة.

يُستخدم عادةً لإعطاء اسم واضح لقيمة ثابتة، مثل حجم مخزن مؤقت أو حدّ.

#define MAX_LEN 256

الاستبدال النصي

الماكرو مجرد استبدال نصي. أينما ظهر MAX_LEN، يكتب المعالج المسبق 256 مكانه.

لا يوجد نوع ولا ذاكرة؛ إذ يحدث ذلك قبل أن يرى المصرّف الشيفرة أصلًا.

#include <stdio.h>
#define MAX_LEN 256
int main(void) {
    printf("%d\n", MAX_LEN);
    return 0;
}

من دون فاصلة منقوطة

من الأخطاء الشائعة إنهاء #define بفاصلة منقوطة.

تصبح الفاصلة المنقوطة جزءًا من نص الاستبدال، وقد تسبب أخطاء مربكة. اتركها.

#define PI 3.14159     /* correct */
#define BAD 10;        /* wrong: semicolon is substituted too */

تعريف ثابت ذي فاصلة عائمة

تعمل الماكروهات مع أي قيمة حرفية، بما في ذلك القيم ذات الفاصلة العائمة.

يُستبدل PI في صيغة مساحة الدائرة عند كل استخدام له.

#include <stdio.h>
#define PI 3.14159
int main(void) {
    double r = 2.0;
    printf("%.2f\n", PI * r * r);
    return 0;
}

الماكروهات لأحجام المصفوفات

تُستخدم الماكروهات كثيرًا لتحديد أحجام المصفوفات، لأن القيمة يجب أن تكون معروفة في وقت الترجمة.

ويحافظ استخدام اسم على وجود الحجم في مكان واحد وسهولة تغييره.

#include <stdio.h>
#define SIZE 5
int main(void) {
    int data[SIZE] = {1, 2, 3, 4, 5};
    printf("%d\n", data[SIZE - 1]);
    return 0;
}

ضع التعبيرات بين قوسين دائمًا

إذا توسّع الماكرو إلى تعبير، فأحطه بأقواس.

من دون الأقواس، قد تغيّر أسبقية العوامل المعنى عند استخدام الماكرو داخل تعبير أكبر.

#define WIDTH (4 + 2)   /* good */
#define BADW 4 + 2       /* risky: 10 * BADW becomes 10*4+2 */

أهمية الأقواس

يوضح هذا البرنامج الفرق. فمع الأقواس يُضرب WIDTH كاملًا، أما من دونها فلا يُضرب سوى جزء منه.

تطبع النسخة الآمنة العدد 60، بينما يحسب التوسّع غير الآمن نتيجة مختلفة.

#include <stdio.h>
#define WIDTH (4 + 2)
int main(void) {
    printf("%d\n", 10 * WIDTH);
    return 0;
}

ماكروهات السلاسل النصية

يمكن أن تمثّل الماكروهات أيضًا سلاسل نصية حرفية، وهذا مفيد للرسائل الثابتة أو أسماء الإصدارات.

يُستبدل النص كما هو تمامًا، بما في ذلك علامتا الاقتباس.

#include <stdio.h>
#define APP_NAME "CoddyKit"
int main(void) {
    printf("Welcome to %s\n", APP_NAME);
    return 0;
}

‎#define مقابل const

لا يملك الماكرو نوعًا ولا عنوانًا، بينما يملك متغير const كليهما ويلتزم بالنطاق.

فضّل const عندما تريد أمان الأنواع وإمكانية رؤية القيمة أثناء تصحيح الأخطاء. واستخدم #define للثوابت المطلوبة في وقت الترجمة، مثل أحجام المصفوفات.

#define M_SIZE 10
const int c_size = 10;

إلغاء التعريف والحواجز

يمكنك إزالة ماكرو باستخدام #undef. كما تعتمد حواجز الترويسات على الماكروهات لمنع التضمين المزدوج.

يوضح هذا النمط التقليدي المستخدم في أعلى ملفات الترويسات.

#ifndef CONFIG_H
#define CONFIG_H
/* header contents here */
#endif

التسمية المتعارف عليها

تُكتب أسماء الماكروهات بصيغة UPPER_CASE وفقًا لعرف قديم ومستمر.

ويُبرز ذلك بصريًا أنها ثوابت للمعالج المسبق، كما يساعدك على تجنب تعارضها مع أسماء المتغيرات العادية.

#include <stdio.h>
#define BUFFER_SIZE 1024
int main(void) {
    printf("%d\n", BUFFER_SIZE);
    return 0;
}

تحقق سريع

اختبر مدى فهمك للماكروهات.

مراجعة

ينشئ #define ماكروهات يستبدلها المعالج المسبق كنص، من دون نوع أو فاصلة منقوطة أو حيز في الذاكرة.

ضع التعبيرات بين أقواس، وفضّل const للقيم الآمنة من ناحية الأنواع، مع حصر الماكروهات في احتياجات وقت الترجمة مثل أحجام المصفوفات وحواجز الترويسات.

البدء مجانًا

تعلم C مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
39
الدروس
144

الأسئلة الشائعة

هل درس «ثوابت #define» مجاني؟

نعم — نص درس «ثوابت #define» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C Academy 4 دروس في المجموع.

ماذا ستتعلم في «ثوابت #define»؟

استخدم ثوابت المعالج القبلي تتمرن على C Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C Academy؟

لا تُشترط خبرة سابقة. C Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «ثوابت #define»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C Academy هذا؟

نعم. كل درس في C Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. تعريف Enums
  2. قيم Enum والنطاقات
  3. متغيرات const
  4. ثوابت #define
← العودة إلى C Academy