Sertakan pengawal sememangnya melindungi fail pengepala anda daripada kemasukan bersama, rekursif. Kekeliruan timbul kerana isunya bukan dengan pengawal, tetapi tentang cara struktur data ditakrifkan dalam fail pengepala.
Pertimbangkan contoh:
// a.h #ifndef A_H #define A_H #include "b.h" struct A { ... }; #endif // A_H // b.h #ifndef B_H #define B_H #include "a.h" struct B { A* pA; }; #endif // B_H // main.cpp #include "a.h" int main() { ... }
Walaupun dengan pengadang sertakan, utama. cpp akan gagal untuk menyusun kerana kelas A (diperlukan untuk kelas B) mempunyai definisi yang tidak lengkap. Pengisytiharan ke hadapan menyelesaikan isu ini:
// b.h #ifndef B_H #define B_H // Forward declare A to avoid circular inclusion struct A; struct B { A* pA; }; #endif // B_H
Sertakan pelindung yang melindungi daripada berbilang definisi dalam satu unit terjemahan, tetapi tidak merentas unit yang berbeza. Untuk menggambarkan:
// header.h #ifndef HEADER_H #define HEADER_H int f() { return 0; } #endif // HEADER_H // source1.cpp #include "header.h" // Redundant include causing multiple definitions #include "header.h" int main() { ... } // source2.cpp #include "header.h" ...
Walaupun dengan pengadang termasuk, pemaut akan mengadu tentang pelbagai takrifan f(). Penyelesaiannya adalah untuk mentakrifkan fungsi dalam hanya satu unit terjemahan atau gunakan kata kunci sebaris untuk mengarahkan pengkompil untuk menyelaraskan badan fungsi pada setiap tapak panggilan.
Atas ialah kandungan terperinci Bagaimana Termasuk Pengawal Mengendalikan Rekursi Bersama dan Takrifan Berbilang Simbol?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!