1. ما هو extern
؟
في لغة C، تُستخدم كلمة extern
كإشارة “لاستعارة شيء من مكان آخر”، أي للاستفادة من متغيرات أو دوال تم تعريفها في ملفات أخرى. على سبيل المثال، إذا أردت استخدام متغير عالمي تم تعريفه في ملف آخر، يمكنك استخدام extern
. عندما يتم تقسيم البرنامج إلى عدة ملفات، تُستخدم extern
لمشاركة البيانات بين هذه الملفات.
تخيل أن البرنامج عبارة عن عدة غرف، وكلمة extern
تعمل كـ “عقد استعارة” للأدوات من الغرفة المجاورة. أي أنها تعني: “ليس هنا، بل في الغرفة المجاورة”.
مثال
// file1.c
int g_data = 100;
// file2.c
extern int g_data;
void printData() {
printf("%d\n", g_data); // الوصول إلى g_data من file1.c
}
في هذا المثال، تم تعريف g_data
في file1.c
، لكن باستخدام extern
يمكنك الوصول إليه من file2.c
.

2. العلاقة بين extern
والمتغيرات العالمية
extern
له علاقة قوية خاصة مع المتغيرات العالمية. المتغير العالمي يمكن الوصول إليه من أي ملف بعد تعريفه مرة واحدة في البرنامج. ومع ذلك، الملفات الأخرى لا تعرف مكان هذا المتغير إلا إذا استخدمت extern
لتخبرهم: “هذا هو هنا!”.
من المهم ملاحظة أن extern
هو مجرد إعلان، ولا يخصص أي ذاكرة. تخصيص الذاكرة للمتغير يتم فقط في الملف الأصلي حيث تم تعريف المتغير.
مثال على المتغيرات العالمية
// file1.c
int counter = 0;
// file2.c
extern int counter; // استخدام counter المُعرف في ملف آخر
void incrementCounter() {
counter++; // تحديث قيمة counter
}
3. استخدام extern
في ملفات الترويسة (Header Files)
عند العمل في مشاريع كبيرة، يصبح تكرار إعلان المتغيرات والدوال أمرًا مرهقًا. هنا تظهر أهمية “ملفات الترويسة”. ملف الترويسة هو ملف يجمع جميع المعلومات المشتركة بين الملفات في مكان واحد. عند وضع إعلانات extern
في ملف الترويسة، يمكن للملفات الأخرى الإشارة لنفس المتغيرات أو الدوال العالمية بسهولة.
يمكن اعتبار ملف الترويسة كـ “صندوق أدوات” للمشروع بأكمله، حيث تُجمع الأدوات المشتركة في مكان واحد وتُستخدم حسب الحاجة في كل ملف.
مثال على ملفات الترويسة
// globals.h
extern int global_variable;
void printGlobalVariable();
// file1.c
#include "globals.h"
int global_variable = 10;
// file2.c
#include "globals.h"
void printGlobalVariable() {
printf("%d\n", global_variable);
}

4. الأخطاء الشائعة عند استخدام extern
هناك بعض النقاط الهامة التي يجب الانتباه لها عند استخدام extern
. على سبيل المثال، لا يمكن تهيئة المتغير عند إعلان extern
. ذلك لأن extern
هو إعلان فقط وليس تعريف. أيضًا، إذا قمت بإعلان متغير باستخدام extern
في ملف دون وجود تعريف حقيقي له في ملف آخر، ستحدث أخطاء عند الربط (link errors).
أخطاء شائعة
extern int data = 100; // غير مسموح بالتهيئة هنا
إذا حاولت تهيئة متغير عند إعلانه مع extern
كما في المثال أعلاه، سيظهر خطأ. extern
يُستخدم فقط للإشارة إلى المتغيرات المعرفة في ملفات أخرى وليس لتعريف أو تهيئة المتغيرات.
5. أمثلة عملية على استخدام extern
يلعب extern
دورًا مهمًا خاصة في المشاريع الكبيرة. على سبيل المثال، في البرامج التي تتكون من عدة وحدات (Modules)، يمكن إعلان البيانات أو الدوال المشتركة باستخدام extern
وإعادة استخدامها في الملفات المختلفة.
في مثل هذه المشاريع، يساعد استخدام extern
على تقسيم البرنامج إلى أجزاء (Modules) صغيرة يسهل صيانتها وقراءتها، بحيث يمكن لكل ملف أن يعمل بشكل مستقل مع إمكانية مشاركة البيانات حسب الحاجة.
مثال عملي
// main.c
#include "globals.h"
int main() {
printGlobalVariable(); // استدعاء دالة معرفة في ملف آخر
return 0;
}
// globals.c
#include "globals.h"
int global_variable = 100;
void printGlobalVariable() {
printf("%d\n", global_variable); // طباعة المتغير العالمي
}
في هذا المقال، قمنا بتغطية كل شيء من أساسيات extern
حتى الاستخدامات العملية له. فهم دور extern
ككلمة مفتاحية مهمة في لغة C يساعد في تحسين تقسيم وإعادة استخدام البرامج.