Rumah > pembangunan bahagian belakang > C++ > Mengapa Termasuk Pengawal Gagal Mencegah Rekursi Bersama dan Definisi Berbilang?

Mengapa Termasuk Pengawal Gagal Mencegah Rekursi Bersama dan Definisi Berbilang?

Susan Sarandon
Lepaskan: 2024-12-30 17:20:17
asal
277 orang telah melayarinya

Why Do Include Guards Fail to Prevent Mutual Recursion and Multiple Definitions?

Mengapa tidak disertakan pengawal yang menghalang kemasukan bersama dan rekursif?

Sertakan pengawal do melindungi fail pengepala daripada kemasukan bersama dan rekursif.

Masalah timbul apabila terdapat kebergantungan antara takrifan struktur data dalam tajuk saling merangkumi. Contohnya:

// a.h
#include "b.h"

struct A
{
    ...
};

// b.h
#include "a.h"

struct B
{
    A* pA; // error: class A is forward-declared but not defined
};
Salin selepas log masuk

Untuk menyelesaikan masalah ini, pengisytiharan hadapan hendaklah digunakan dan bukannya menyertakan pengawal:

// b.h
#include "a.h"

// Forward declaration of A
struct A;

struct B
{
    A* pA;
};
Salin selepas log masuk

Mengapa tidak termasuk pengawal yang menghalang pelbagai definisi?

Sertakan pengawal do melindungi pengepala daripada kemasukan berlebihan dalam unit terjemahan yang sama. Walau bagaimanapun, berbilang takrifan masih boleh berlaku kerana kehadirannya dalam unit terjemahan yang berbeza.

Untuk menyelesaikannya, kata kunci sebaris boleh digunakan untuk membenarkan berbilang takrifan dalam unit terjemahan yang berbeza:

// header.h
inline int f()
{
    ...
}
Salin selepas log masuk

Sebagai alternatif, definisi fungsi boleh dialihkan ke fail sumber yang berasingan untuk mengelakkan berbilang definisi:

// source.cpp
int f()
{
    ...
}
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapa Termasuk Pengawal Gagal Mencegah Rekursi Bersama dan Definisi Berbilang?. 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan