القائمة الرئيسية

الصفحات

C - Header Files / ملفات الرأس

 ملف الرأس هو ملف بامتداد .h يحتوي على إعلانات دالة C وتعريفات ماكرو لمشاركتها بين عدة ملفات مصدر. هناك نوعان من ملفات الرأس: الملفات التي يكتبها المبرمج والملفات التي تأتي مع المترجم.

أنت تطلب استخدام ملف رأس في برنامجك عن طريق تضمينه مع توجيه المعالجة المسبقة C # تضمين ، كما رأيت تضمين ملف رأس stdio.h ، والذي يأتي مع برنامج التحويل البرمجي الخاص بك.

إن تضمين ملف header يساوي نسخ محتوى ملف header لكننا لا نقوم بذلك لأنه سيكون عرضة للخطأ وليس من الجيد نسخ محتوى ملف header في الملفات المصدر ، خاصةً إذا كنا لديك ملفات مصدر متعددة في برنامج.

من الممارسات البسيطة في برامج C أو C ++ أننا نحتفظ بجميع الثوابت ووحدات الماكرو والمتغيرات العالمية على مستوى النظام ونماذج الوظائف في ملفات الرأس وتضمين ملف الرأس هذا حيثما كان ذلك مطلوبًا.

تضمين بناء الجملة

يتم تضمين ملفات رأس المستخدم والنظام باستخدام توجيه المعالجة المسبقة #include . له الشكلين التاليين -

#include <file>

يستخدم هذا النموذج لملفات رأس النظام. يبحث عن ملف يسمى "ملف" في قائمة قياسية لأدلة النظام. يمكنك إضافة الدلائل إلى هذه القائمة مسبقًا باستخدام الخيار -I أثناء تجميع التعليمات البرمجية المصدر.

#include "file"

يستخدم هذا النموذج لملفات الرأس الخاصة بالبرنامج الخاص بك. يبحث عن ملف يسمى "ملف" في الدليل الذي يحتوي على الملف الحالي. يمكنك إضافة الدلائل إلى هذه القائمة مسبقًا باستخدام الخيار -I أثناء تجميع التعليمات البرمجية المصدر.

تشمل العملية

و # تشمل أعمال التوجيهية بتوجيه C المعالج لمسح الملف المحدد كمدخل قبل المتابعة مع بقية الملف المصدر الحالي. يحتوي الإخراج من المعالج الأولي على الإخراج الذي تم إنشاؤه بالفعل ، متبوعًا بالإخراج الناتج من الملف المضمن ، متبوعًا بالإخراج الذي يأتي من النص بعد التوجيه #include . على سبيل المثال ، إذا كان لديك ملف header.h على النحو التالي -

char *test (void);

وبرنامج رئيسي يسمى program.c يستخدم ملف الرأس ، مثل هذا -

int x;
#include "header.h"

int main (void) {
   puts (test ());
}

سيشاهد المترجم دفق الرمز المميز نفسه كما لو قرأ program.c.

int x;
char *test (void);

int main (void) {
   puts (test ());
}

رؤوس لمرة واحدة فقط

إذا تم تضمين ملف الرأس مرتين ، فسيقوم المترجم بمعالجة محتوياته مرتين وسيؤدي ذلك إلى حدوث خطأ. الطريقة القياسية لمنع ذلك هي إحاطة المحتويات الحقيقية الكاملة للملف بشكل شرطي ، مثل هذا -

#ifndef HEADER_FILE
#define HEADER_FILE

the entire header file file

#endif

يُعرف هذا البناء عمومًا باسم غلاف #ifndef . عندما يتم تضمين الرأس مرة أخرى ، سيكون الشرط خطأ ، لأنه تم تعريف HEADER_FILE. سيتخطى المعالج المسبق محتويات الملف بالكامل ، ولن يراه المحول البرمجي مرتين.

يشمل المحسوبة

في بعض الأحيان يكون من الضروري تحديد واحد من عدة ملفات رأس مختلفة لتضمينها في برنامجك. على سبيل المثال ، قد تحدد معلمات التكوين لاستخدامها في أنواع مختلفة من أنظمة التشغيل. يمكنك القيام بذلك بسلسلة من الشروط على النحو التالي -

#if SYSTEM_1
   # include "system_1.h"
#elif SYSTEM_2
   # include "system_2.h"
#elif SYSTEM_3
   ...
#endif

ولكن مع نموها ، تصبح مملة ، وبدلاً من ذلك يوفر المعالج المسبق القدرة على استخدام ماكرو لاسم الرأس. وهذا ما يسمى التضمين المحسوب . بدلاً من كتابة اسم رأس كوسيطة مباشرة لـ # تضمين ، يمكنك ببساطة وضع اسم ماكرو هناك -

#define SYSTEM_H "system_1.h"
...
#include SYSTEM_H

سيتم توسيع SYSTEM_H ، وسيبحث المعالج المسبق عن system_1.h كما لو أن # include قد تمت كتابته بهذه الطريقة في الأصل. يمكن تعريف SYSTEM_H بواسطة Makefile الخاص بك مع خيار -D.


الصفحة التالية                                                                                 الصفحة السابقة  

هل اعجبك الموضوع :

تعليقات