في لغة C، يُستخدم مصطلح "Function Declaration" (إعلان الدالة) و "Function Definition" (تعريف الدالة) لوصف جزأين منفصلين ولكن مترابطين في بناء الدوال. إليك شرح مفصل لكل منهما:
1. Function Declaration (إعلان الدالة):
- الغرض: يُخبر المُصرّف (Compiler) بوجود دالة ما، ويُعطيه معلومات أساسية عنها مثل:
- اسم الدالة.
- نوع القيمة التي تُرجعها الدالة (Return Type).
- عدد وأنواع المُعاملات (Parameters) التي تستقبلها الدالة.
- الصيغة العامة:
C
return_type function_name(parameter_type1 parameter1, parameter_type2 parameter2, ...);
- مثال:
C
int add(int a, int b); // إعلان دالة اسمها add تُرجع عددًا صحيحًا وتستقبل مُعاملين صحيحينvoid printMessage(char message[]); // إعلان دالة اسمها printMessage لا تُرجع شيئًا وتستقبل سلسلة نصية
- مكان الإعلان: عادةً ما يتم وضع إعلانات الدوال في ملفات الرأس (.h files) أو في بداية ملف المصدر (.c file) قبل استدعاء الدالة. هذا يُمكن المُصرّف من التحقق من صحة استدعاءات الدوال قبل الوصول إلى تعريفها الفعلي.
- أهميته: يُمكنك إعلان دالة دون تعريفها مباشرةً. هذا مفيد في الحالات التالية:
- الفصل بين الواجهة والتنفيذ: يُمكنك وضع إعلانات الدوال في ملف رأس لتمثيل واجهة مكتبة ما، بينما يكون تعريف الدوال في ملف مصدر منفصل.
- الاستدعاءات الأمامية (Forward Declarations): إذا كانت دالة تستدعي دالة أخرى مُعرّفة بعدها في نفس الملف، يجب عليك إعلان الدالة الثانية قبل استدعائها.
2. Function Definition (تعريف الدالة):
- الغرض: يُقدّم التنفيذ الفعلي للدالة، أي الكود الذي يتم تنفيذه عند استدعاء الدالة.
- الصيغة العامة:
C
return_type function_name(parameter_type1 parameter1, parameter_type2 parameter2, ...) { // كود الدالة // ... return return_value; // إذا كانت الدالة تُرجع قيمة}
- مثال:
C
int add(int a, int b) { // تعريف الدالة add int sum = a + b; return sum;}
void printMessage(char message[]) { // تعريف الدالة printMessage printf("%s\n", message);}
- مكان التعريف: عادةً ما يتم وضع تعريفات الدوال في ملفات المصدر (.c files).
- يجب أن يكون هناك تعريف واحد فقط لكل دالة في البرنامج.
العلاقة بين الإعلان والتعريف:
- يجب أن يتطابق إعلان الدالة مع تعريفها من حيث:
- اسم الدالة.
- نوع القيمة المُرجعة.
- عدد وأنواع المُعاملات.
- يُمكن أن يكون هناك إعلان واحد أو أكثر لدالة ما، ولكن يجب أن يكون هناك تعريف واحد فقط.
- إذا لم يتم إعلان دالة قبل استدعائها، سيحاول المُصرّف استنتاج الإعلان من الاستدعاء، وهو ما قد يُؤدي إلى مشاكل في بعض الحالات.
مثال كامل يُوضح الفرق:
C
#include <stdio.h>
// إعلان الدالةint multiply(int x, int y);
int main() { int result = multiply(5, 3); // استدعاء الدالة printf("The result is: %d\n", result); return 0;}
// تعريف الدالةint multiply(int x, int y) { return x * y;}
في هذا المثال:
- تم إعلان الدالة
multiply
قبلmain
، مما يُخبر المُصرّف بوجودها. - تم تعريف الدالة
multiply
بعدmain
، حيث تم تقديم التنفيذ الفعلي للدالة.