Sertakan pengawal memberikan perlindungan terhadap kemasukan rekursif, tetapi ia tidak boleh menghalang kebergantungan antara definisi struktur data dalam pengepala yang saling merangkumi. Pertimbangkan kod berikut:
// header.h #ifndef HEADER_H #define HEADER_H class A; class B { public: A* pA; }; #endif // HEADER_H
// source1.cpp #include "header.h" A* aPtr = new A;
// source2.cpp #include "header.h" B* bPtr = new B;
Dalam senario ini, source1.cpp menyertakan header.h, yang merangkumi source2.cpp (secara tidak langsung). Tingkah laku ini dihalang dengan memasukkan pengawal, tetapi pengkompil masih akan melaporkan ralat kerana kelas A tidak ditakrifkan dalam header.h.
Untuk menyelesaikan isu ini, pengisytiharan hadapan boleh digunakan dalam header.h:
// header.h #ifndef HEADER_H #define HEADER_H struct A; class B { public: A* pA; }; #endif // HEADER_H
Ini memastikan bahawa pengkompil menyedari kewujudan kelas A tanpa memberikan definisinya.
Sertakan pengawal menghalang takrifan berbilang simbol dalam unit terjemahan yang sama (fail.cpp). Walau bagaimanapun, ia tidak melindungi daripada berbilang definisi merentas unit terjemahan yang berasingan.
Pertimbangkan kod berikut:
// header.h #ifndef HEADER_H #define HEADER_H int f() { return 0; } #endif // HEADER_H
// source1.cpp #include "header.h" int main() { f(); }
// source2.cpp #include "header.h" int main() { f(); }
Dalam contoh ini, fungsi f() ditakrifkan dalam tajuk.h. Apabila source1.cpp dan source2.cpp disusun secara berasingan, pengawal termasuk akan menghalang berbilang definisi dalam setiap unit terjemahan. Walau bagaimanapun, apabila kod objek dipautkan bersama, pemaut akan mengesan berbilang takrifan bagi f().
Untuk menyelesaikan isu ini, kata kunci sebaris boleh digunakan untuk memberitahu pengkompil untuk menyelaraskan definisi fungsi secara terus di tapak panggilan:
// header.h #ifndef HEADER_H #define HEADER_H inline int f() { return 0; } #endif // HEADER_H
Sebagai alternatif, definisi fungsi boleh dialihkan ke fail .cpp yang berasingan untuk mengelakkan percanggahan dengan definisi dalam terjemahan lain unit.
Atas ialah kandungan terperinci Mengapa Termasuk Pengawal Gagal Mencegah Kemasukan Rekursif dan Definisi Berbilang Simbol?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!