ليش نقسّم البرنامج؟
برنامج واحد بملف .c ضخم صعب القراءة والصيانة. القسمة الشائعة: ملف .h يحتوي
الإعلانات (ماذا يوجد)، وملف .c يحتوي التعريفات (كيف يعمل).
ملف الرأس (Header)
// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
int square(int x); // إعلان فقط، بدون جسم الدالة
#endif
الحراسة #ifndef / #define / #endif تمنع تضمين نفس الملف مرّتين لو استورده
أكثر من ملف .c في نفس الترجمة.
ملف التنفيذ
// math_utils.c
#include "math_utils.h"
int square(int x) {
return x * x;
}
الاستخدام من main
// main.c
#include <stdio.h>
#include "math_utils.h" // اقتباسات لملفاتك، أقواس <> لمكتبات النظام
int main(void) {
printf("%d\n", square(4)); // 16
return 0;
}
الترجمة بأكثر من ملف
gcc main.c math_utils.c -o program
./program
gcc يترجم كل ملف .c على حدة (بفضل الإعلان في الهيدر يعرف كل ملف توقيع
الدوال الأخرى)، ثم يربطها معًا في ملف تنفيذي واحد.
💡 الهيدر يحتوي إعلانات فقط (توقيع دوال،
struct،typedef). ضع تعريف الدالة الفعلي في ملف.cدائمًا، وإلا تحصل على خطأ ربط عند تضمين الهيدر بأكثر من ملف.
أخطاء شائعة
- نسيان حراسة التضمين (
#ifndef) فيحدث تعريف مكرّر عند تضمين الهيدر مرّتين. - وضع تعريف دالة كامل (لا إعلان فقط) داخل ملف
.h. - نسيان تمرير كل ملفات
.cلأمرgccعند الترجمة.
🎯 التالي: معاملات سطر الأوامر.