#include "DLLDefines.h" #include "DLLDefines.h" The above actually passed compilation, but why?
7 Réponses :
probablement vous en avez probablement un #define dans dlldefines.h autour de votre code qui l'empêche d'être incluse deux fois.
#ifndef DLLDEFINES_H #define DLLDEFINES_H // your code #endif
Nitpick: Cette technique ne l'empêche pas d'être incluse deux fois; Cela permet de l'inclure à plusieurs reprises.
@CHARDLES: Il empêche le code de l'en-tête d'être lu deux fois, ce qui est ce qui est normalement destiné à inclure un fichier.
En effet, je ne savais pas comment le dire sans surcharger l'explication. Le préprocesseur ignorera le contenu à l'intérieur du #IffnDEF la deuxième fois que le fichier est inclus.
@RUBENVB: Je comprends que, je pense juste que c'est important de ne pas faire #include code> semble plus magique que lorsque l'adresseur de la question doit évidemment comprendre les bases. Être strictement précis mai i> aider à éviter la confusion.
Cela dépend du fichier d'en-tête; Il n'y a pas de restriction linguistique sur plusieurs inclres du même fichier. P>
Certains fichiers sont conçus pour être inclus à plusieurs reprises (par exemple, De nombreux fichiers sont sans danger pour être inclus à plusieurs reprises car ils sont incluent les gardes em>, d'autres ne doivent pas être inclus une seule fois dans une unité de traduction ou même un programme. P>
affirmation code>). p>
Inclure n'a rien à voir avec la langue C ou C ++. C'est une directive sur le préprocesseur d'apporter un fichier. Le préprocesseur ne se soucie pas de ce que le fichier est introduit et cela ne devrait pas. Il peut être parfaitement acceptable de faire cela:
void Foo::SomeFunc(int cond) { switch (cond) { case kThisCase: #include "longFirstCase.h" break; case kSecondCase: #include "longSecondCase.h" break; case kThirdCase: #include "longFirstCase.h" #include "longSecondCase.h" break; } }
Comment vous attendez-vous à ce que cela fonctionne? #Incluant les choses en fonction des informations d'exécution?
@Shautieh, #include code> insère le fichier source Verbatim. Vraisemblablement, les fichiers
longfirscase.h code> et
longsecondcase.h code> contiennent le code C signifiant être à l'intérieur de l'interrupteur code>.
@Shautieh comme Strager a dit, il colle le code dans le fichier où le #include est écrit. Par exemple, cette technique est souvent utilisée de manière à inclure des parties du code autogogenéré.
Cela peut être logique d'inclure du code CPP, mais des fichiers d'en-tête? Je ne dis pas que ça ne marchera pas, mais ça ne me semble pas "juste".
@Shautieh: L'extension dans un nom de fichier n'affecte pas #include code>. Dans ce cas imaginaire, les fichiers
.h code> doivent contenir certaines lignes de code destinées à être abandonnées au milieu d'une fonction. Certes, la plupart des programmeurs donneraient au fichier une extension différente, peut-être
.inc code>.
.h est juste une extension de fichier. Vous coudl renommez-les à .CPP et #incluez-les, mais .CPP implique que le fichier peut être compilé tout seul, et certains systèmes de construction essaieront de compiler tous les fichiers .CPP qu'ils trouvent échoueraient ici que les fichiers ne sont pas contiennent du code "complet", juste des fragments.
Le préprocesseur fait partie des langues C et C ++.
@Steve: Si l'on doit vraiment inclure les implémentations de cette façon, donnant une extension telle que .InC serait un mal moindre en effet. @Soapbox: .h n'est pas "juste" une extension. Cela peut être le cas pour le préprocesseur, mais il est contre toutes les conventions sensibles de l'utiliser comme celle-ci et cela va mordre le développeur plus tôt ou tard pour cette raison.
C'est ce qu'on appelle un Inclure la garde forte> .
#ifndef GRANDFATHER_H #define GRANDFATHER_H struct foo { int member; }; #endif
Tant que l'inclusion multiple des fichiers d'en-tête ne violait pas ODR (une règle de définition) 3,2 $, le code est bien formé. P>
dlldefines.h peut aussi avoir #pragma une fois à la Top, #pragma une fois garantissant que le fichier ne soit inclus qu'une fois. p>
C'est une extension de Microsoft uniquement, IIRC.
@Justboo selon Wikipedia , la plupart des compilateurs Support #pragma une fois code >
Eh bien, c'est légal car il a em> être légal. Parce que vous incluez souvent la même en-tête plusieurs fois sans même le réaliser. Vous pouvez inclure deux en-têtes dans un fichier .CPP, chacun d'entre eux incluant un certain nombre de fichiers, dont certains pourraient être inclus par les deux. P> Par exemple, tous les en-têtes de bibliothèque standard (disent, Donc en bref, il a em> au travail, ou tout le code C ++ tomberait Apart. P> comme pour comment fonctionne em> Ça marche, généralement à travers des gardes. N'oubliez pas que Disons donc Vous avez un fichier d'en-tête Créons maintenant un fichier CPP qui y comprend deux fois: p> string code> ou
vecteur code> par exemple) sont probablement inclus dans la plupart de vos en-têtes. Donc, vous vous retrouvez rapidement avec le même en-tête inclus indirectement inclus plusieurs fois dans le même fichier. CPPP. P>
#include code> effectue simplement une copie / pâte simple: elle insère le contenu du fichier d'en-tête au site
#include code> site. P>
header.h code> avec le contenu suivant: p>
#ifndef HEADER_H // HEADER_H is not defined, so we enter the "if" block
#define HEADER_H // HEADER_H is now defined
class MyClass {};// MyClass is now defined
#endif // leaving the "if" block
#ifndef HEADER_H // HEADER_H *is* defined, so we do *not* enter the "if" block
//#define HEADER_H
//
//class MyClass {};
//
#endif // end of the skipped "if" block
Pourquoi serait-il invalide? (Question sérieuse; essayer de voir comment vous comprenez
#include code>.)
Pour suivre le point de Strager:
#include code> colle le contenu du fichier fourni dans le fichier actuel. Rien d'autre (mis à part peut-être des annotations spécifiques à la mise en œuvre pour aider le compilateur à signaler les numéros de ligne pour les erreurs et émet des informations de débogage). Il n'y a aucune raison particulière de vous interdire de le faire deux fois, et les fichiers
.h code> le supportent en utilisant comprennent les gardes.