حواجز التضمين
جزء من قسم البرمجة كائنية التوجه في رحلة C على Coddy. الدرس 2 من 61.
عند تضمين ملف ترويسة عدة مرات في مشروع، يرى المترجم التصريحات نفسها مرارًا، مما يسبب أخطاء. يحدث هذا عادةً عندما تتضمن ملفات متعددة ملف الترويسة نفسه، أو عندما تتضمن ملفات الترويسة بعضها بعضًا. تحل حواجز التضمين هذه المشكلة.
يستخدم واقي التضمين ثلاثة توجيهات للمعالج المسبق لضمان معالجة محتويات ملف الترويسة مرة واحدة فقط:
// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
int add(int a, int b);
#endif
إليك كيفية عمل ذلك: يتحقق #ifndef MATH_UTILS_H مما إذا كان الرمز MATH_UTILS_H لم يُعرَّف بعد. إذا لم يكن قد عُرِّف، تتابع المعالجة المسبقة وتعرّفه فورًا باستخدام #define MATH_UTILS_H. يُضمَّن كل ما بين هذه النقطة و#endif في عملية الترجمة.
في المرة الثانية التي يُضمَّن فيها هذا الملف الترويـسي، يكون MATH_UTILS_H معرّفًا بالفعل، لذلك يتم تخطي الكتلة بأكملها. عادةً ما يكون اسم الحارس هو اسم الملف بأحرف كبيرة، مع استبدال النقاط والمحارف الخاصة بشرطات سفلية.
يجب أن يحتوي كل ملف ترويسة تنشئه على حواجز تضمين. هذه ممارسة قياسية تمنع أخطاء الترجمة وتجعل تضمين شيفرتك آمنًا من أي مكان في مشروعك.
التحدي
سهللنحمِ ملف ترويسة من التضمين المتكرر بإضافة حواجز التضمين. ستبني على أداة التحية من الدرس السابق، لكن هذه المرة تأكد من أن الترويسة آمنة عند تضمينها عدة مرات.
ستنشئ ملفين:
greet.h: ملف الترويسة الذي يحتوي على تصريح الدالةgreet. هذه المرة، أَحِط المحتويات كاملةً بحواجز التضمين باستخدام الرمزGREET_H.main.c: ملفك الرئيسي الذي يضمّن الترويسة، وينفّذ الدالةgreet، ويستدعيها منmain().
يجب أن تقبل الدالة greet مُعاملًا من النوع const char* للاسم وأن تطبع:
Hello, Alice!يجب أن يتبع ملف الترويسة هذا الهيكل:
#ifndef GREET_H
#define GREET_H
// function declaration here
#endifستتلقى مُدخلًا واحدًا: اسمًا (سلسلة نصية).
اطبع رسالة التحية تمامًا كما هو موضح في التنسيق أعلاه، مع استبدال Alice بالاسم المُعطى.
جرّب بنفسك
#include <stdio.h>
#include "greet.h"
// TODO: نفّذ الدالة greet التي تطبع "Hello, <name>!"
int main() {
char name[100];
scanf("%s", name);
// TODO: استدعِ الدالة greet مع الاسم
return 0;
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
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مشروع: رسّام الأشكال
نظرة عامة على المشروعتنفيذ الدائرةتنفيذ المستطيلاستخدام تعدد الأشكالحاوية الأشكالتدرّب بنفسك: مترجم C عبر الإنترنت