الدوال الساكنة
جزء من قسم Object Oriented Programming في رحلة C على Coddy — الدرس 4 من 61.
عندما تقوم بتقسيم الكود عبر ملفات متعددة، تكون كل دالة محددة في ملف مصدر مرئية للملفات الأخرى بشكل افتراضي. ولكن في بعض الأحيان تحتاج إلى دوال مساعدة يجب استخدامها داخلياً فقط - وهي دوال لا ينبغي للملفات الأخرى الوصول إليها أو حتى معرفة وجودها.
الكلمة المفتاحية static، عند تطبيقها على دالة، تقيد نطاق رؤيتها بالملف الذي عُرّفت فيه. يؤدي هذا إلى إنشاء دالة خاصة لا يمكن استدعاؤها من ملفات المصدر الأخرى، حتى لو حاول شخص ما التصريح عنها.
// math_utils.c
#include "math_utils.h"
// مساعد خاص - مرئي فقط في هذا الملف
static int square(int x) {
return x * x;
}
// دالة عامة - يمكن استدعاؤها من main.c
int sum_of_squares(int a, int b) {
return square(a) + square(b);
}
في هذا المثال، تم التصريح عن sum_of_squares في الترويسة ويمكن استخدامه في أي مكان. ومع ذلك، تم تمييز square بـ static، لذا فهو موجود فقط داخل math_utils.c. إذا حاول main.c استدعاء square() مباشرة، سينتج الرابط (linker) خطأً—فالدالة ببساطة غير موجودة خارج ملفها.
هذه هي طريقة لغة C لتحقيق التغليف (encapsulation) على مستوى الملف. تسمح لك الدوال الساكنة (Static functions) بإخفاء تفاصيل التنفيذ، مما يحافظ على نظافة واجهتك العامة مع استخدام أي منطق مساعد تحتاجه داخلياً.
التحدي
سهللنقم ببناء حاسبة مسافة تستخدم دالة مساعدة خاصة لحساب مربع الرقم—وهو تفصيل يجب أن يظل مخفياً عن بقية برنامجك.
ستقوم بإنشاء ثلاثة ملفات:
distance.h: ملف الرأس الخاص بك الذي يعلن عن دالة عامة واحدةdistance_squaredتأخذ أربعة أعداد صحيحة (x1, y1, x2, y2) تمثل نقطتين وتعيد عدداً صحيحاً. قم بتضمين حراس التضمين (guards) باستخدام الرمزDISTANCE_H.distance.c: ملف المصدر الخاص بك الذي يحتوي على التنفيذ. قم بإنشاء دالة مساعدةstaticتسمىsquareتأخذ عدداً صحيحاً وتعيد مربعه. يجب أن تكون هذه الدالة المساعدة مرئية فقط داخلdistance.c. ثم قم بتنفيذdistance_squaredباستخدام دالتك المساعدة الستاتيكية لحساب (x2-x1)² + (y2-y1)².main.c: ملفك الرئيسي الذي يتضمن ملف الرأس ويستخدم الدالة العامة. يجب ألا تكون الدالة المساعدةsquareقابلة للوصول هنا—فقطdistance_squaredهي المتاحة.
تقوم الدالة distance_squared بحساب مربع المسافة الإقليدية بين نقطتين. من خلال إبقاء الدالة square ستاتيكية، فإنك تخفي تفاصيل التنفيذ هذه عن أي كود خارج distance.c.
ستتلقى أربعة مدخلات من الأعداد الصحيحة: x1، و y1، و x2، و y2.
اطبع مربع المسافة بهذا التنسيق:
Squared distance: {result}على سبيل المثال، مع النقطتين (0, 0) و (3, 4)، سيكون الناتج:
Squared distance: 25ورقة مرجعية
تقيد الكلمة المفتاحية static رؤية الدالة في الملف الذي تم تعريفها فيه، مما يؤدي إلى إنشاء دالة خاصة لا يمكن استدعاؤها من ملفات مصدر أخرى.
// مساعد خاص - مرئي فقط في هذا الملف
static int square(int x) {
return x * x;
}
// دالة عامة - يمكن استدعاؤها من ملفات أخرى
int sum_of_squares(int a, int b) {
return square(a) + square(b);
}
توفر الدوال الساكنة (Static functions) تغليفاً على مستوى الملف، مما يسمح لك بإخفاء تفاصيل التنفيذ مع الحفاظ على نظافة الواجهة العامة الخاصة بك.
جرّب بنفسك
#include <stdio.h>
#include "distance.h"
int main() {
int x1, y1, x2, y2;
scanf("%d", &x1);
scanf("%d", &y1);
scanf("%d", &x2);
scanf("%d", &y2);
// TODO: استدعِ distance_squared باستخدام إحداثيات المدخلات
// واطبع النتيجة بالتنسيق التالي: "Squared distance: {result}"
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مشروع: رسّام الأشكال
نظرة عامة على المشروعتنفيذ الدائرة