首頁  >  文章  >  後端開發  >  如何處理 C 中標頭之間的循環依賴關係?

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

Linda Hamilton
Linda Hamilton原創
2024-10-26 12:11:29403瀏覽

 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn