Rumah > pembangunan bahagian belakang > C++ > Bagaimana Mengendalikan Kebergantungan Pekeliling Antara Pengepala dalam C?

Bagaimana Mengendalikan Kebergantungan Pekeliling Antara Pengepala dalam C?

Linda Hamilton
Lepaskan: 2024-10-26 12:11:29
asal
555 orang telah melayarinya

 How to Handle Circular Dependencies Between Headers in C  ?

Pengepala Termasuk Satu Sama Lain dalam C

Dalam C , kadangkala pengepala perlu menyertakan satu sama lain. Walau bagaimanapun, ini boleh membawa kepada isu, terutamanya apabila ia melibatkan tempat meletakkan kenyataan #include.

Makro Dalam atau Luar

Secara amnya, #include statement seharusnya diletakkan di dalam makro, seperti #ifndef sertakan pengawal. Ini menghalang rekursi tak terhingga semasa penyusunan, seperti yang ditunjukkan dalam contoh berikut:

<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>
Salin selepas log masuk
<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>
Salin selepas log masuk

Menempatkan penyataan #include di luar makro menyebabkan pengkompil berulang selama-lamanya disebabkan oleh kemasukan bersama antara A.h dan B.h.

Jenis Tidak Diisytiharkan

Walau bagaimanapun, meletakkan pernyataan #include di dalam makro boleh membawa kepada isu dengan jenis yang tidak diisytiharkan. Sebagai contoh, pertimbangkan kod berikut:

<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>
Salin selepas log masuk
<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>
Salin selepas log masuk

Dalam kes ini, pengkompil akan mengadu bahawa A ialah jenis yang tidak diisytiharkan dalam B.h. Ini kerana pengisytiharan hadapan dalam A.h tidak kelihatan apabila B.h disertakan.

Penyelesaian: Pengisytiharan Hadapan

Untuk menyelesaikan isu ini, sebaiknya gunakan pengisytiharan hadapan dan sertakan pengepala yang mengandungi definisi penuh jika perlu. Dalam contoh ini, pengisytiharan hadapan A hendaklah ditambahkan pada B.h sebelum takrifan 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>
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana Mengendalikan Kebergantungan Pekeliling Antara Pengepala dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan