2010-06-05 8 views
8

En C++, quel est le rôle de l'en-tête dans le programme C++. De net j'ai trouvé que c'est pour éviter d'inclure des fichiers encore et encore, mais comment l'en-tête de garde le garantit.Objectif des protecteurs d'en-tête

+0

Le terme accepté pour cela en C++ est "include guard". –

+0

Wikipédia donne [une très bonne explication] (http://en.wikipedia.org/wiki/Include_guard) de la façon dont les gardes travaillent. –

Répondre

14

L'en-tête de garde sert à éviter les problèmes si le fichier d'en-tête est inclus plusieurs fois; par exemple.

#ifndef MARKER 
#define MARKER 
// declarations 
#endif 

La première fois que ce fichier est #include -ed, le symbole MARKER préprocesseur sera indéfini, de sorte que le préprocesseur définira le symbole, et les déclarations suivantes seront inclus dans le code source vu par le compilateur. Sur les #include suivants, le symbole MARKER sera défini, et par conséquent tout le #ifnde/#endif sera supprimé par le préprocesseur. Pour que cela fonctionne correctement, le symbole MARKER doit être différent pour chaque fichier d'en-tête pouvant être #include -ed.

La raison pour laquelle ce genre de chose est nécessaire est qu'il est illégal en C/C++ de définir un type ou une fonction portant le même nom plusieurs fois dans une unité de compilation. La garde autorise un fichier d'en-tête à #include autres fichiers d'en-tête sans craindre que cela puisse entraîner l'inclusion de plusieurs déclarations plusieurs fois.


En bref, il ne empêche vous de #include -ment un fichier encore et encore. Plutôt, il permet vous de le faire sans provoquer d'erreurs de compilation.

2

Le but des protecteurs d'en-tête est d'éviter les problèmes où du code peut apparaître une seule fois par unité de traduction.

Un exemple est une structure. Vous ne pouvez pas redéfinir une structure même si la seconde définition est identique. Donc, si vous essayez de compiler ce qui suit:

struct foo { int x; }; 
struct foo { int x; }; 

Le compilateur échouera en raison de la redéfinition.

Il peut être difficile de garantir que vous n'incluez qu'une seule fois l'en-tête (cela se produit lorsque les en-têtes incluent d'autres en-têtes). Si votre en-tête a une définition de structure, cela entraînera l'échec de la compilation. Les gardes d'en-tête sont la solution facile, de sorte que même si un en-tête est inclus plusieurs fois, son contenu n'apparaît qu'une seule fois.