définit préprocesseur sont locaux à l'unité de compilation en cours.
Bien sûr, il y a des cas complexes, mais voici le point:
Essayez de regarder .CPP (source) comme des entités distinctes. Si vous ne faites pas des choses vraiment étranges, puis si vous supprimez tous les fichiers .cpp sauf celui que vous dérangez, vous pouvez encore compiler, car dans la phase de compilation pas besoin pour les définitions, vous vous souciez seulement du nom (déclaration) des choses.
Ainsi, la compilation de fichiers source N dans une course est essentiellement ceci:
[ *.H + SOURCE1.CPP ] --> SOURCE1.O
[ *.H + SOURCE2.CPP ] --> SOURCE2.O
...
[ *.H + SOURCEN.CPP ] --> SOURCEN.O
où chaque ligne est une unité de compilation distincte, qui rend le SourceX.CPP et les en-têtes inclus dans un fichier d'objets . Donc, nous sommes arrivés ici N chose séparée. Ainsi, si vous ne modifiez pas les en-têtes communs, vous n'avez pas besoin de recompiler les fichiers source non modifiés. Bien sûr, si vous modifiez un fichier source, vous devez le recompiler. Et enfin, si vous modifiez un en-tête commun, vous avez pour recompiler tous les fichiers source qui l'ont inclus. Ici, je dois mentionner, qu'avant la phase de compilation, tous les #inlude "filename.ext"
ligne (directive préprocesseur) seront remplacés avec le contenu exact du fichier filename.ext, quel qu'il soit.
Ensuite, la liaison est un problème différent, dans ce stade le but est de créer un seul fichier à partir de ce N fichiers objet. (je le répète, cela est le cas simple)
C'est un lien:
[ SOURCE1.O + SOURCE2.O + ... + SOURCEN.O ] --> EXECUTABLE.FILE
Imaginez l'affecté les fichiers objet comme un sac de valeurs et algorithmes (fonction définitions). Par exemple, quelque part dans le sac il doit y avoir exactement une main
fonction (définition), de sorte que le lieur va certainement savoir ce que à faire lorsque vous exécutez le programme.
espère que vous l'avez
Devinez ce qui arrive, si vous écrivez une définition de fonction globale dans un fichier d'en-tête, et vous inclure dans deux unités de compilation séparée, alors vous essayez de les relier.
L'erreur Answerer: plusieurs définitions, puisque vous pouvez les compiler séparément.
C'est ce que je devinais ... est-il possible de vérifier si elle est incluse deux fois? – user103214
@ user974191 vous pouvez regarder les fichiers après que le préprocesseur se soit terminé avec eux, mais pourquoi voulez-vous? –
Voulez-vous dire les fichiers objets? Rien que d'essayer de comprendre ce qui se passe. – user103214