الرؤوس تتضمن بعضها البعض في لغة C
في لغة C، من الضروري أحيانًا أن تتضمن الرؤوس بعضها البعض. ومع ذلك، يمكن أن يؤدي هذا إلى مشكلات، خاصة عندما يتعلق الأمر بمكان وضع عبارات التضمين.
داخل أو خارج وحدات الماكرو
بشكل عام، يجب أن تتضمن عبارات التضمين يتم وضعها داخل وحدات الماكرو، مثل #ifndef تتضمن الحراس. وهذا يمنع التكرار اللانهائي أثناء الترجمة، كما هو موضح في المثال التالي:
// A.h
#ifndef A_H_
#define A_H_
#include "B.h"
class A {
private:
B b;
public:
A() : b(*this) {}
};
#endif // A_H_
// B.h
#ifndef B_H_
#define B_H_
#include "A.h"
class B {
private:
A& a;
public:
B(A& a) : a(a) {}
};
#endif // B_H_
يؤدي وضع عبارات #include خارج وحدات الماكرو إلى تكرار المترجم إلى أجل غير مسمى بسبب التضمين المتبادل بين A.h وB.h.
أنواع غير معلنة
ومع ذلك، فإن وضع عبارات التضمين # داخل وحدات الماكرو يمكن أن يؤدي إلى مشكلات تتعلق بالأنواع غير المعلنة. على سبيل المثال، خذ بعين الاعتبار الكود التالي:
// A.h
#ifndef A_H_
#define A_H_
class A; // Forward declaration
#include "B.h"
class A {
private:
B b;
public:
A() : b(*this) {}
};
#endif // A_H_
// B.h
#ifndef B_H_
#define B_H_
#include "A.h"
class B {
private:
A a; // Directly include A
public:
B(A& a) : a(a) {}
};
#endif // B_H_
في هذه الحالة، سيشكو المترجم من أن A هو نوع غير معلن داخل B.h. وذلك لأن الإقرارات الأمامية في A.h غير مرئية عند تضمين B.h.
الحل: الإقرارات الأمامية
لحل هذه المشكلات، من الأفضل استخدام الإقرارات الأمامية وقم بتضمين الرأس الذي يحتوي على التعريف الكامل عند الضرورة. في هذا المثال، يجب إضافة إعلان أمامي لـ A إلى B.h قبل تعريف B:
// B.h
#ifndef B_H_
#define B_H_
class A; // Forward declaration
#include "A.h"
class B {
private:
A a; // Directly include A
public:
B(A& a) : a(a) {}
};
#endif // B_H_
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3