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
Susan Sarandonasal
2024-12-30 17:20:17286semak imbas

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
};

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;
};

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()
{
    ...
}

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

// source.cpp
int f()
{
    ...
}

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!

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