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
Lepaskan: 2024-12-19 15:18:19
asal
501 orang telah melayarinya

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
Salin selepas log masuk
// source1.cpp
#include "header.h"

A* aPtr = new A;
Salin selepas log masuk
// source2.cpp
#include "header.h"

B* bPtr = new B;
Salin selepas log masuk

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
Salin selepas log masuk

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
Salin selepas log masuk
// source1.cpp
#include "header.h"
int main() {
    f();
}
Salin selepas log masuk
// source2.cpp
#include "header.h"
int main() {
    f();
}
Salin selepas log masuk

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
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan