Rumah >pembangunan bahagian belakang >C++ >Mengapa Pengawal Termasuk Saya Gagal Mencegah Kemasukan Rekursif dan Definisi Berbilang Simbol?
Mengapa tidak disertakan pengawal melindungi fail pengepala saya daripada saling, rekursif kemasukan?
Sertakan pengawal sedang menjalankan tugas mereka. Isu timbul daripada kebergantungan antara takrifan struktur data dalam pengepala yang merangkumi bersama.
Sebagai contoh, anggap a.h dan b.h mengandungi:
// a.h #ifndef A_H #define A_H #include "b.h" struct A {...}; #endif // b.h #ifndef B_H #define B_H #include "a.h" struct B {...}; #endif
Tanpa pengadang sertakan, main.cpp tidak akan kompilkan kerana had kedalaman kompilasi.
Dengan pengadang termasuk, rekursi tak terhingga ialah dihalang. Walau bagaimanapun, kebergantungan antara definisi kekal:
Untuk menyelesaikan masalah ini, gunakan pengisytiharan hadapan dalam pengepala yang memerlukannya:
// b.h #ifndef B_H #define B_H struct A; // Forward declaration struct B {...}; #endif
Mengapa tidak disertakan pengawal menghalang pelbagai definisi?
Sertakan pengawal boleh menghalang definisi semula dalam unit terjemahan tunggal tetapi tidak merentasi unit yang berbeza.
Contohnya, apabila header.h:
#ifndef HEADER_H #define HEADER_H int f() {...}; #endif
Termasuk dalam berbilang unit terjemahan, seperti source1.cpp dan source2.cpp:
// source1.cpp #include "header.h" // source2.cpp #include "header.h"
Penyambung akan mengadu tentang berbilang takrifan f(), kerana ia melihat takrifan yang sama dalam objek berasingan fail.
Untuk menyelesaikannya, gunakan pendekatan berikut:
Atas ialah kandungan terperinci Mengapa Pengawal Termasuk Saya Gagal Mencegah Kemasukan Rekursif dan Definisi Berbilang Simbol?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!