J'ai vu du code comme celui-ci généralement au début des fichiers d'en-tête:
#ifndef HEADERFILE_H
#define HEADERFILE_H
Et à la fin du fichier se trouve
#endif
Quel en est le but?
c++
c
c-preprocessor
Asad Khan
la source
la source
#pragma
vaut mentionner ce qu'est un : il active une fonctionnalité spécifique au compilateur. Bien qu'il#pragma once
soit très largement pris en charge, il n'est pas standard.info cpp
ou regardez ici ) dit "elle n'est pas reconnue par tous les préprocesseurs, vous ne pouvez donc pas vous y fier dans un programme portable.". Et GNU cpp optimise l'#ifndef
idiome commun et portable pour qu'il soit aussi efficace que#pragma once
.#ifndef HEADERFILE_H
peut violer l'espace de noms de l'implémentation du nom de l'en-tête qui commence parE
; les identifiants commençant parE
et un chiffre ou une lettre majuscule sont réservés à<errno.h>
. Je suggère#ifndef H_HEADERFILE
.Réponses:
Ceux-ci sont appelés #include gardes .
Une fois l'en-tête inclus, il vérifie si une valeur unique (dans ce cas
HEADERFILE_H
) est définie. Ensuite, s'il n'est pas défini, il le définit et continue vers le reste de la page.Lorsque le code est à nouveau inclus, le premier
ifndef
échoue, ce qui entraîne un fichier vide.Cela empêche la double déclaration des identifiants tels que les types, les énumérations et les variables statiques.
la source
#pragma once
qui fait la même chose :-)#pragma once
n'est pas portable; l'#ifndef
idiome commun est recommandé.#ifndef
vérifie si le jeton donné a été#defined
plus tôt dans le fichier ou dans un fichier inclus; sinon, il inclut le code entre celui-ci et la clôture#else
ou, si aucun#else
n'est présent, l'#endif
instruction.#ifndef
est souvent utilisé pour rendre les fichiers d'en-tête idempotents en définissant un jeton une fois que le fichier a été inclus et en vérifiant que le jeton n'a pas été défini en haut de ce fichier.la source
#ifndef H_HEADER_NAME
.Cela empêche l'inclusion multiple du même fichier d'en-tête plusieurs fois.
Supposons que vous ayez inclus ce fichier d'en-tête dans plusieurs fichiers. Donc, la première fois que __COMMON_H__ n'est pas défini, il sera défini et le fichier d'en-tête sera inclus.
La prochaine fois que __COMMON_H__ est défini, il ne sera donc plus inclus.
la source
Ils sont appelés ifdef ou incluent des gardes.
Si vous écrivez un petit programme, il peut sembler que ce n'est pas nécessaire, mais au fur et à mesure que le projet se développe, vous pouvez inclure plusieurs fois intentionnellement ou non un fichier, ce qui peut entraîner un avertissement de compilation comme une variable déjà déclarée.
S'il n'est pas déclaré, ce qui signifie que #ifndef génère vrai, alors seule la partie entre #ifndef et #endif est exécutée sinon. Cela évitera de déclarer à nouveau les identifiants, énumérations, structure, etc ...
la source