Maison > développement back-end > C++ > Pourquoi l'inclusion de gardes ne parvient-elle pas à empêcher la récursion mutuelle et les définitions multiples ?

Pourquoi l'inclusion de gardes ne parvient-elle pas à empêcher la récursion mutuelle et les définitions multiples ?

Susan Sarandon
Libérer: 2024-12-30 17:20:17
original
277 Les gens l'ont consulté

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

Pourquoi les gardes d'inclusion n'empêchent-ils pas l'inclusion mutuelle et récursive ?

Les gardes d'inclusion do protègent les fichiers d'en-tête d'une inclusion mutuelle et récursive.

Le problème se pose lorsqu'il existe des dépendances entre les définitions des structures de données dans des en-têtes qui s'incluent mutuellement. Par exemple :

// 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
};
Copier après la connexion

Pour résoudre ce problème, les déclarations forward doivent être utilisées au lieu des gardes d'inclusion :

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

// Forward declaration of A
struct A;

struct B
{
    A* pA;
};
Copier après la connexion

Pourquoi les gardes d'inclusion n'empêchent-ils pas plusieurs définitions ?

Include guards do protège un en-tête des inclusions redondantes dans la même unité de traduction. Cependant, plusieurs définitions peuvent toujours apparaître en raison de leur présence dans différentes unités de traduction.

Pour résoudre ce problème, le mot-clé inline peut être utilisé pour autoriser plusieurs définitions dans différentes unités de traduction :

// header.h
inline int f()
{
    ...
}
Copier après la connexion

Alternativement, la définition de la fonction peut être déplacée vers un fichier source distinct pour éviter plusieurs définitions :

// source.cpp
int f()
{
    ...
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal