Bagaimana Mengendalikan Kebergantungan Pekeliling Antara Pengepala dalam C?

Linda Hamilton
Lepaskan: 2024-10-26 12:11:29
asal
401 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!

sumber:php.cn
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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!