Rumah >pembangunan bahagian belakang >C++ >Bagaimana Mengendalikan Kebergantungan Pekeliling Antara Pengepala dalam 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>
<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>
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>
<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>
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>
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!