même en-tête de fichier en plusieurs fichiers source dans un programme c++
Si le même fichier d'en-tête est inclus dans plusieurs fichiers sources dans un programme c++, alors comment fait-il effet de la compilation ( en Particulier g++ ) ?
Sera le compilateur charger le fichier d'en-tête une seule fois et de le compiler pour chaque fichier source qui inclut l'en-tête ou le fichier d'en-tête sera chargé séparément pour chaque fichier source qui l'inclut .
Comment les fichiers d'en-tête sont chargés est, autant que je sache, n'est pas spécifié dans la compilation C++ modèle. La mise en œuvre peut choisir de charger une fois, le chargement sur demande (pour tous les fichiers source), ou de la charge d'une autre façon bizarre inimaginable par mon finis cerveau.
fondamentalement
Conceptuellement, chaque fichier que vous compilation est un regard nouveau sur l'en-tête. En réalité, il ya une assez bonne chance que votre compilateur prend en charge une certaine forme de pré-compilés en-têtes, de sorte qu'il compile le code source de certains forme intermédiaire, puis utilise que lorsqu'il compile les autres fichiers qui contiennent le même en-tête.
Est-il une chance pour que le compilateur g++ est optimisé pour charger un fichier d'en-tête une seule fois, même sur de multiples appelant à partir de différents fichiers source ?S'il vous plaît confirmer.
il ne peuvent absolument. Les en-têtes précompilés sont une chose commune et n'ont pas à être stocké en mémoire dans un processus unique. Ils peuvent facilement être écrites sur le disque et utilisées plus tard par les processus suivants.
fondamentalement
#include *.h
signifie "à" remplacer tout le texte à partir de *.h fichier iciConceptuellement, chaque fichier que vous compilation est un regard nouveau sur l'en-tête. En réalité, il ya une assez bonne chance que votre compilateur prend en charge une certaine forme de pré-compilés en-têtes, de sorte qu'il compile le code source de certains forme intermédiaire, puis utilise que lorsqu'il compile les autres fichiers qui contiennent le même en-tête.
Est-il une chance pour que le compilateur g++ est optimisé pour charger un fichier d'en-tête une seule fois, même sur de multiples appelant à partir de différents fichiers source ?S'il vous plaît confirmer.
il ne peuvent absolument. Les en-têtes précompilés sont une chose commune et n'ont pas à être stocké en mémoire dans un processus unique. Ils peuvent facilement être écrites sur le disque et utilisées plus tard par les processus suivants.
OriginalL'auteur Biraj Bora | 2013-05-31
Vous devez vous connecter pour publier un commentaire.
La plupart des fichiers d'en-tête jouissent d'une protection spéciale contre les inclusions multiples comme
Sans cette protection, en-tête peut être inclus plus d'une fois et cela peut causer de la compilation ou les erreurs de liaison.
Compilateur peut être assez intelligent pour éviter de lire des fichiers plus d'une fois. Mais, même si elle n'a pas, les systèmes d'exploitation sont très bons à la mise en cache des fichiers qui ont été récemment lu, et cela vous permettra de charger très, très rapidement, presque sans frais.
oui, la recompilation est assez rapide comparé à la première compilation des codes.
OriginalL'auteur mvp
Parlant de g++:
#include
s sont effectuées par le pré-processeur, et pas le compilateur lui-même. Vous pouvez voir le résultat de pré-traitement à l'aide de g++'s-E
commutateur. (Edit: Le pré-processeur utilisé pour être distinctes, mais fait maintenant partie de l'exécutable du compilateur, cependant, le pré-traitement de la phase est toujours une phase différente du processus de compilation pour les fins de répondre à cette question).Avec gcc, clang, de la cpi et msvc, chaque fichier va être visité chaque fois qu'elle est rencontrée, même dans le même fichier source.
Le seul cas où cela n'est pas vrai, c'est si le fichier d'en-tête contient un
#pragma once
déclaration. Certains compilateurs ont une optimisation pour l'utilisateur d'inclure des-gardes:Il existe une technique appelée "les en-têtes précompilés", soutenu par msvc et gcc (et probablement clang) qui travaillera avec vous pour éviter la compilation à la tête de la plus couramment utilisée jeu d'en-têtes.
Typiquement, cela se fait en ayant un .h ou .fichier cpp avec tous vos
#include
s; puis, vous#include
ce fichier dans chaque dossier (ou utiliser l'idée de "forcé d'inclure": /Fi gratuite dans msvc, -inclure avec gcc). Chaque fichier qui utilise un pch doit avoir le même définit et options du compilateur.Si vous deviez écrire la suite .h fichier
et les suivants .fichier cpp
La sortie serait
g++
:#include
-s sont fait par le pré-processeur": depuis de nombreuses années,g++
commencecc1plus
, qui est un programme unique fait de pré-traitement, d'analyse, d'optimisation, de code de serre.... Le prétraitement est effectué par le compilateur (cc1plus
), et non pas séparément. (C'était un processus distinct dans GCC dans les années 1990).Jusqu'à présent, que je sache, le préprocesseur était encore un discret passage dans son intégralité avant le début de la phase de compilation?
C'était vrai il y a longtemps... Et qui ne va pas aujourd'hui.
cc1plus
(à partir de GCC 4.x) est la liaison d'une bibliothèque internelibcpp
qui ne le prétraitement et quelques jetons. Et de prétraitement qui se passe pendant (juste avant l'analyse) de manière incrémentielle.... GCC ne fonctionne pas par prétraitement tout à la fois, et plus tard l'analyse de la séquence d'formulaire (même si elle semble fonctionner de cette façon).n'est que de lire mieux?
OriginalL'auteur kfsone
La pré-processeur sera il suffit de remplacer la définition de la macro dans chaque fichier source, et après cela a été fait, le compilateur va commencer à compiler tous les fichiers source indépendante de l'assemblage des fichiers, qui seront ensuite convertis en un fichier binaire en code machine par Assembleur. Et le de l'éditeur de liens va à la dernière liaison de tous les fichiers de l'objet à une seule le fichier exécuté ou un objet partagé.
Donc, c'est essentiellement non de l'activité d'un compilateur à un pré-traitement des progrès. Et g++ est un ensemble d'outils comprennent des pré-processeur, compilateur, éditeur de liens.
Dans la compilation de l'étape. Je ne pense pas qu'il y a beaucoup de travail à faire pour le fichier de tête dans le processus d'optimisation. Après tout, tous ceux qui sont des déclarations de fonctions ou de définitions de classe ou d'autres informations qui ont besoin d'un uniforme de l'expression. Vous avez toutes vos fonctions déclarées dans un fichier d'en-tête, et un autre cc de fichier pour la mise en œuvre. Vous ne voulez pas mettre en œuvre vos fonctions dans un fichier d'en-tête, pensez-vous? Mais quand ça arrive, je pense qu'ils vont être optimisée lors de la compilation de l'étape de façon indépendante, mais je ne suis pas sûr.
OriginalL'auteur zoujyjs