2011-04-20 2 views
21

En C (ou une langue basée sur C), on peut heureusement utiliser cette déclaration:Que fait réellement #include?

#include "hello.h"; 

Et le tour est joué, toutes les fonctions et variables dans hello.h est automagiquement utilisable.

Mais que fait-il réellement? J'ai regardé des documents et des didacticiels du compilateur et j'ai passé un peu de temps à chercher en ligne, mais la seule impression que j'ai pu avoir à propos de la commande magique est qu'elle "copie" le contenu de hello.h au lieu de cette ligne. Il doit y avoir plus que ça.

+2

Si c'est une consolation, le préprocesseur peut également insérer des annotations spécifiques à la mise en œuvre de telle sorte que si/quand les informations de débogage est généré, il obtient les numéros de ligne droite. S'il avait littéralement l'effet d'un copier-coller, le débogueur ne connaîtrait pas le "vrai" fichier source et le numéro de ligne. De même, "__FILE__' et" __LINE__' doivent être remplacés comme avant le copier-coller. En ce qui concerne la signification du programme, cependant, copier-coller l'est. –

Répondre

21

Logiquement, ce copier/coller est exactement ce qui se passe. J'ai peur qu'il n'y en ait plus. Cependant, vous n'avez pas besoin du ;.

Votre exemple est couvert par la spécification, la section 6.10.2 inclusion de fichiers Source, paragraphe 3:

Une directive de pré-traitement de la forme

# include"q-char -sequence"nouvelle ligne

provoque le remplacement de cette directive par le contenu entier du fichier source identifié par la séquence spécifiée entre les délimiteurs ".

5

Cela (copier/coller) est exactement ce que fait #include "header.h".

Notez que ce sera différent pour #include <header.h> ou lorsque le compilateur ne peut pas trouver le fichier "header.h" et qu'il essaie à #include <header.h> à la place.

+1

"Différent" seulement en ce qu'il cherche généralement à différents endroits et est associé mentalement aux en-têtes de bibliothèque (standard). – delnan

+0

@delnan, ils ne doivent pas être différent du tout - toutes les recherches sont effectuées d'une manière « définie par l'implémentation », selon les spécifications. La différence est que la forme '" "' revient à la forme '<>' si cela ne fonctionne pas. @pmg est totalement correct. –

+0

aussi « différent » parce qu'il n'a pas besoin d'être un fichier nommé ' « thing.h »' 'quand vous faites #include '. – pmg

0

Pas vraiment, non. Le compilateur enregistre le descripteur de fichier d'origine sur une pile et ouvre le fichier #include d; quand il atteint la fin de ce fichier, il le ferme et retourne au descripteur de fichier d'origine. De cette façon, il peut nicher #include fichiers d presque arbitrairement.

+1

passeur de compilateur dans gcc par exemple ne sait rien à propos de #include, car il est préprocesseur passer. – fazo

+0

@fazo: Dans la plupart des cas, la distinction n'y est pas significative. Si vous avez besoin de pedantry pour une raison quelconque, je peux aller chercher une liste incomplète de compilateurs et s'ils utilisent des préprocesseurs ou non. – geekosaur

0

Les « # include » déclaration « attire l'attention » de la pré -processeur (le processus qui se produit avant que votre programme ne soit compilé) et "indique" au pré-processeur d'inclure tout ce qui suit l'instruction "# include". Alors que le pré-processeur peut être dit à faire un peu, dans ce cas, il est demandé de reconnaître un fichier d'en-tête (qui est indiqué par un ".h" suivant le nom de cet en-tête, indiquant qu'il s'agit d'un en-tête). Maintenant, un en-tête est un fichier contenant des déclarations C et des définitions de fonctions non explicitement définies dans votre code. Qu'est-ce que ça veut dire?Eh bien, si vous voulez utiliser une fonction ou définir un type spécial de variable, et vous savez que ces fonctions/définitions sont définies ailleurs (par exemple, la bibliothèque standard), vous pouvez simplement inclure (# include) l'en-tête que vous connaissez De quoi as-tu besoin. Sinon, chaque fois que vous voudriez utiliser une fonction d'impression (comme dans votre cas), vous devrez recréer la fonction d'impression. Si ce ne est pas explicitement défini dans votre code et vous ne #include le fichier d'en-tête avec la fonction que vous utilisez, votre compilateur va se plaindre en disant quelque chose comme « Hé, je ne vois pas où cette fonction est définie, donc je don Ne savez pas quoi faire avec cette fonction indéfinie dans votre code! ".

Questions connexes