استخدام الكلمة المفتاحية extern في لغة C: الشرح الكامل مع أمثلة عملية

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 يساعد في تحسين تقسيم وإعادة استخدام البرامج.