Maison > développement back-end > C++ > Comment les gardes inclus gèrent-ils la récursion mutuelle et les définitions de symboles multiples ?

Comment les gardes inclus gèrent-ils la récursion mutuelle et les définitions de symboles multiples ?

DDD
Libérer: 2024-12-23 06:17:20
original
394 Les gens l'ont consulté

How Do Include Guards Handle Mutual Recursion and Multiple Symbol Definitions?

Pourquoi les gardes d'inclusion n'offrent-ils pas une protection mutuelle contre la récursion ou n'empêchent-ils pas la définition de plusieurs symboles ?

Récursion mutuelle

Les gardes d'inclusion protègent effectivement vos fichiers d'en-tête de l’inclusion mutuelle et récursive. La confusion vient du fait que le problème ne vient pas des gardes, mais de la manière dont les structures de données sont définies dans les fichiers d'en-tête.

Considérez l'exemple :

// a.h
#ifndef A_H
#define A_H

#include "b.h"

struct A {
  ...
};

#endif // A_H

// b.h
#ifndef B_H
#define B_H

#include "a.h"

struct B {
  A* pA;
};

#endif // B_H

// main.cpp
#include "a.h"
int main() {
  ...
}
Copier après la connexion

Même avec des gardes d'inclusion, main. cpp ne parviendra pas à compiler car la classe A (nécessaire pour la classe B) a une définition incomplète. Les déclarations directes résolvent ce problème :

// b.h
#ifndef B_H
#define B_H

// Forward declare A to avoid circular inclusion
struct A;

struct B {
  A* pA;
};

#endif // B_H
Copier après la connexion

Définitions multiples

Inclure des protections pour protéger contre plusieurs définitions au sein d'une seule unité de traduction, mais pas entre différentes unités. Pour illustrer :

// header.h
#ifndef HEADER_H
#define HEADER_H

int f() {
  return 0;
}

#endif // HEADER_H

// source1.cpp
#include "header.h"

// Redundant include causing multiple definitions
#include "header.h"

int main() {
  ...
}

// source2.cpp
#include "header.h"

...
Copier après la connexion

Même avec des gardes d'inclusion, l'éditeur de liens se plaindra de plusieurs définitions de f(). La solution consiste à définir la fonction dans une seule unité de traduction ou à utiliser le mot-clé inline pour demander au compilateur d'intégrer le corps de la fonction sur chaque site d'appel.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal