Rumah >pembangunan bahagian belakang >C++ >Mengapa Termasuk Pengawal Gagal Mencegah Kemasukan Rekursif dan Definisi Berbilang Simbol?

Mengapa Termasuk Pengawal Gagal Mencegah Kemasukan Rekursif dan Definisi Berbilang Simbol?

DDD
DDDasal
2024-12-19 15:18:19540semak imbas

Why Do Include Guards Fail to Prevent Recursive Inclusion and Multiple Symbol Definitions?

Mengapa tidak termasuk pengawal yang menghalang kemasukan rekursif dan definisi simbol berbilang?

Kemasukan Rekursif

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.

Berbilang Simbol Definisi

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!

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