首頁 > 後端開發 > C++ > 主體

如何處理 C 中標頭之間的循環依賴關係?

Linda Hamilton
發布: 2024-10-26 12:11:29
原創
452 人瀏覽過

 How to Handle Circular Dependencies Between Headers in C  ?

C 中的標頭互相包含

在 C 中,標頭有時需要互相包含。但是,這可能會導致問題,尤其是在放置 #include 語句的位置時。

內部或外部巨集

一般來說,#include 語句應該放置在巨集內部,例如#ifndef include Guards。這可以防止編譯過程中的無限遞歸,如下例所示:

<code class="cpp">// A.h
#ifndef A_H_
#define A_H_

#include "B.h"

class A {
    private:
        B b;
    public:
        A() : b(*this) {}
};

#endif // A_H_</code>
登入後複製
<code class="cpp">// 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_</code>
登入後複製

將#include 語句放在巨集之外會導致編譯器由於A.h 和B.h 之間的相互包含而無限遞歸

未聲明的類型

但是,將#include 語句放在巨集中可能會導致未聲明類型的問題。例如,考慮以下程式碼:

<code class="cpp">// 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_</code>
登入後複製
<code class="cpp">// 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_</code>
登入後複製

在這種情況下,編譯器會抱怨 A 是 B.h 中未聲明的類型。這是因為當包含 B.h 時,A.h 中的前向聲明是不可見的。

解決方案:前向聲明

要解決這些問題,最好使用前向聲明並在必要時包含包含完整定義的標題。在此範例中,應將 A 的前向聲明加入 B.h 的 B 定義之前:

<code class="cpp">// 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_</code>
登入後複製

以上是如何處理 C 中標頭之間的循環依賴關係?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板