ملفات المصدر
جزء من قسم Object Oriented Programming في رحلة C على Coddy — الدرس 3 من 61.
حتى الآن، قمنا بوضع تصريحات الدوال (function declarations) في ملفات الترويسة (header files)، لكن كود الدالة الفعلي (التعريف - definition) كان موجوداً في الملف الرئيسي (main file). الخطوة التالية في البرمجة التركيبية (modular programming) هي نقل تلك التعريفات إلى ملفات المصدر (.c files) الخاصة بها.
يؤدي هذا إلى إنشاء هيكل نظيف مكون من ثلاثة أجزاء: يقوم ملف الترويسة (header) بالتصريح عن الدوال، ويقوم ملف مصدر منفصل بتعريفها، وتقوم الدالة main ببساطة باستخدامها. إليك كيف يبدو الأمر:
// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
int add(int a, int b);
#endif
// math_utils.c
#include "math_utils.h"
int add(int a, int b) {
return a + b;
}
// main.c
#include <stdio.h>
#include "math_utils.h"
int main() {
printf("%d\n", add(5, 3));
return 0;
}
لاحظ أن math_utils.c يتضمن ملف الترويسة (header) الخاص به. يضمن ذلك تطابق تعريف الدالة مع التصريح عنها—وإذا لم يتطابقا، فسيقوم المترجم (compiler) باكتشاف الخطأ. يحتاج الملف الرئيسي فقط إلى تضمين ملف الترويسة لاستخدام الدالة؛ ولا يحتاج إلى معرفة كيفية عمل add داخلياً.
هذا الفصل يُبقي تفاصيل التنفيذ مخفية ويسمح لك بتعديل منطق الدالة دون المساس بالملفات التي تستخدم تلك الدوال.
التحدي
سهللنقم ببناء أداة رياضية بسيطة من خلال تنظيم الكود الخاص بك في هيكل مكون من ثلاثة ملفات: ملف رأس (header) للإعلانات، وملف مصدر (source) للتنفيذات، وملف رئيسي (main) يستخدمهما.
ستقوم بإنشاء ثلاثة ملفات:
math_ops.h: ملف الرأس الخاص بك الذي يحتوي على إعلانات الدوال لعمليتين:multiplyوsubtract. تأخذ كلتا الدالتين عددين صحيحين وتعيدان عدداً صحيحاً. لا تنسَ تضمين الحماية (guards) باستخدام الرمزMATH_OPS_H.math_ops.c: ملف المصدر الخاص بك الذي يحتوي على التنفيذات الفعلية لـmultiplyوsubtract. يجب أن يتضمن هذا الملف ملف الرأس الخاص به لضمان تطابق الإعلانات مع التعريفات.main.c: ملفك الرئيسي الذي يتضمن ملف الرأس ويستخدم كلتا الدالتين لإجراء الحسابات.
يجب أن تعيد الدالة multiply حاصل ضرب عددين صحيحين، ويجب أن تعيد subtract العدد الصحيح الأول مطروحاً منه الثاني.
ستتلقى مدخلين من نوع عدد صحيح: a و b.
في الدالة الرئيسية (main)، قم بطباعة نتائج كلتا العمليتين في سطرين منفصلين:
Product: {result of multiply}
Difference: {result of subtract}على سبيل المثال، مع المدخلات 8 و 3، سيكون الناتج:
Product: 24
Difference: 5ورقة مرجعية
يمكن نقل تعريفات الدوال من الملف الرئيسي إلى ملفات مصدر منفصلة (ملفات .c)، مما يؤدي إلى إنشاء هيكل معياري مكون من ثلاثة أجزاء:
- ملف الرأس (
.h): يحتوي على تصريحات الدوال - ملف المصدر (
.c): يحتوي على تعريفات الدوال - الملف الرئيسي (
main.c): يستخدم الدوال
هيكل مثال:
// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
int add(int a, int b);
#endif
// math_utils.c
#include "math_utils.h"
int add(int a, int b) {
return a + b;
}
// main.c
#include <stdio.h>
#include "math_utils.h"
int main() {
printf("%d\n", add(5, 3));
return 0;
}
يجب أن يتضمن ملف المصدر (.c) ملف الرأس الخاص به للتأكد من أن تعريف الدالة يطابق التصريح. يحتاج الملف الرئيسي فقط إلى تضمين ملف الرأس لاستخدام الدوال، مما يحافظ على إخفاء تفاصيل التنفيذ.
جرّب بنفسك
#include <stdio.h>
#include "math_ops.h"
int main() {
int a, b;
scanf("%d", &a);
scanf("%d", &b);
// TODO: استدعِ الدالة multiply مع a و b، وقم بتخزين النتيجة
// TODO: استدعِ الدالة subtract مع a و b، وقم بتخزين النتيجة
// TODO: اطبع النتائج بالتنسيق التالي:
// Product: {result of multiply}
// Difference: {result of subtract}
return 0;
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
1أساسيات البرمجة التركيبية
ملفات الترويسةحواجز التضمينملفات المصدرالدوال الساكنةمراجعة: آلة حاسبة تركيبية4التغليف (Encapsulation)
مفهوم الـ Opaque Pointersتعريف الـ Opaque Structsالـ Getters والـ Settersالتحقق من البيانات في الـ Settersملخص: الصندوق السري2الكائنات والأساليب
الـ Structs ككائناتمؤشر 'Self'صحة استخدام Constالمؤشر مقابل القيمةالأساليب المساعدةملخص: Point Manager5مشروع: حساب بنكي بسيط
إعداد المشروعتنفيذ الحساب3دورة حياة الكائن
نمط المنشئ (Constructor Pattern)نمط الهادم (Destructor Pattern)تهيئة الـ Stackالنسخ العميق (Deep Copy)مراجعة: String Wrapper6الوراثة عبر التركيب
تضمين الـ Structقاعدة العضو الأولالوصول إلى أعضاء الأبعملية الـ Upcastingمراجعة: هرمية الأشكال9مشروع: رسّام الأشكال
نظرة عامة على المشروعتنفيذ الدائرة