Rumah >pembangunan bahagian belakang >C++ >Bagaimana Termasuk Pengawal Mengendalikan Rekursi Bersama dan Takrifan Berbilang Simbol?

Bagaimana Termasuk Pengawal Mengendalikan Rekursi Bersama dan Takrifan Berbilang Simbol?

DDD
DDDasal
2024-12-23 06:17:20466semak imbas

How Do Include Guards Handle Mutual Recursion and Multiple Symbol Definitions?

Mengapa tidak termasuk pengawal yang menyediakan perlindungan rekursi bersama atau menghalang definisi simbol berbilang?

Rekursi Bersama

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

Berbilang Definisi

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!

Kenyataan:
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