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
Susan Sarandonoriginal
2024-12-30 17:20:17281parcourir

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

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

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

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

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!

Déclaration:
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