0Pricing
C Academy · درس

مشاريع متعددة الملفات

الترويسات ووحدات الترجمة

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

لماذا نقسم الملفات

لا تعيش البرامج الحقيقية في ملف .c واحد. يؤدي تقسيم الشيفرة إلى ملفات متعددة إلى:

  • تجميع الدوال المرتبطة معًا
  • تمكين المصرّف من إعادة بناء ما تغيّر فقط
  • جعل الشيفرة قابلة لإعادة الاستخدام عبر المشاريع
  • تمكين الفريق من العمل دون تعارضات مستمرة

يُعد فهم كيفية ربط الأجزاء أمرًا أساسيًا.

وحدات الترجمة

يصبح كل ملف .c، بعد أن يوسّع المعالج القبلي توجيهات #include فيه، وحدة ترجمة.

يحوّل المصرّف كل وحدة ترجمة إلى ملف كائن (.o) بشكل مستقل. ولا يعرف شيئًا عن الملفات الأخرى في هذه المرحلة.

التصريح مقابل التعريف

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

تحتاج الملفات الأخرى إلى التصريح فقط لاستدعاء الدالة. ويكون التعريف في موضع واحد بالضبط.

int add(int a, int b);          /* declaration: a promise */

int add(int a, int b) {         /* definition: the body */
    return a + b;
}

ملف الترويسة

توضع التصريحات في ترويسة (.h). ويضمّن أي ملف يريد استخدام الدالة ملف الترويسة.

تمثّل الترويسة الواجهة العامة؛ أما ملف .c المطابق فيمثّل التنفيذ الخاص.

/* math_utils.h */
#ifndef MATH_UTILS_H
#define MATH_UTILS_H

int add(int a, int b);
int mul(int a, int b);

#endif

ملف التنفيذ

يضمّن ملف .c ترويسته الخاصة ويعرّف الدوال.

يسمح تضمين ترويستك الخاصة للمصرّف بالتحقق من تطابق التعريفات مع التصريحات.

/* math_utils.c */
#include "math_utils.h"

int add(int a, int b) { return a + b; }
int mul(int a, int b) { return a * b; }

استخدام الوحدة

يضمّن ملف آخر الترويسة ويستدعي الدوال. ولا يحتاج أبدًا إلى رؤية الأجسام.

يثق المصرّف بالتصريحات؛ وسيربط الرابط الاستدعاءات بالتعريفات الفعلية لاحقًا.

/* main.c */
#include <stdio.h>
#include "math_utils.h"

int main(void) {
    printf("%d\n", add(2, 3));
    return 0;
}

التصريف والربط

توجد مرحلتان. أولًا، صرّف كل ملف إلى ملف كائن باستخدام -c. ثم اربط ملفات الكائنات في ملف تنفيذي واحد.

يحلّ الرابط كل استدعاء لـ add بالعثور على تعريفه في math_utils.o.

gcc -c main.c          # -> main.o
gcc -c math_utils.c    # -> math_utils.o
gcc main.o math_utils.o -o app

علامات الاقتباس مقابل الأقواس الزاوية

تتحكم صيغة التضمين في مسار البحث:

  • يبحث #include "math_utils.h" في مجلد مشروعك أولًا
  • يبحث #include <stdio.h> في مسارات تضمين النظام فقط

استخدم علامات الاقتباس لترويساتك الخاصة، والأقواس الزاوية للمكتبة القياسية.

الكلمة المفتاحية extern

لمشاركة متغير عام عبر الملفات، عرّفه مرة واحدة في ملف .c، ثم صرّح عنه باستخدام extern في الترويسة.

تقول extern إن «هذا المتغير موجود في مكان آخر»، مما يتجنب التعريفات المكررة.

/* in config.h */
extern int g_verbose;   /* declaration */

/* in config.c */
int g_verbose = 0;      /* the single definition */

الكلمة المفتاحية static

على مستوى الملف، تجعل static الدالة أو المتغير خاصًا بوحدة الترجمة الخاصة به.

لا يمكن ربط دالة مساعدة ثابتة من ملفات أخرى، مما يمنع تعارضات الأسماء ويخفي تفاصيل التنفيذ. وهذه هي طريقة C لوَسْم شيء بأنه داخلي.

/* visible only inside this .c file */
static int helper(int x) {
    return x * 2;
}

قاعدة التعريف الواحد

يمكن تعريف الدالة غير الساكنة أو المتغير العام مرة واحدة بالضبط في البرنامج بأكمله. ويمكن التصريح بهما في ملفات كثيرة، لكن يجب تعريف كل منهما في ملف واحد.

يؤدي وجود تعريفين لـ add إلى خطأ من الرابط مثل multiple definition of 'add'. ولهذا السبب تبقى أجسام الدوال خارج ملفات الترويسة.

تحقق سريع

فكّر في العناصر التي تنتمي إلى ملف الترويسة.

مراجعة

أصبح بإمكانك الآن تنظيم مشروع متعدد الملفات:

  • كل ملف .c هو وحدة ترجمة تُترجم بشكل مستقل إلى ملف .o
  • تحتوي ملفات الترويسة على التصريحات، بينما يحتوي ملف .c واحد على كل تعريف
  • يحل الرابط الاستدعاءات بين ملفات الكائنات
  • تشارك extern المتغيرات العامة، بينما تُبقي static الرموز المحلية للملف خاصة

التالي: أتمتة عملية البناء باستخدام Makefiles.

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

هل درس «مشاريع متعددة الملفات» مجاني؟

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

ماذا ستتعلم في «مشاريع متعددة الملفات»؟

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

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

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

كم من الوقت يستغرق درس «مشاريع متعددة الملفات»؟

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

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

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

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

  1. الترجمة الشرطية
  2. مشاريع متعددة الملفات
  3. Makefiles
  4. المكتبات الساكنة والمشتركة
← العودة إلى C Academy