La compilation d'un programme C++ comporte plusieurs étapes:
Prétraitement: le préprocesseur prend un code source C++ de fichier et traite de l' #include
s, #define
s et d'autres directives de préprocesseur. La sortie de cette étape est un "pur" fichier C++ sans pré-processeur directives;
Compilation: le compilateur prend le pré-processeur de sortie et produit un fichier objet.
Liens: l'éditeur de liens prend des fichiers de l'objet produit par le compilateur et génère une bibliothèque ou d'un fichier exécutable.
Prétraitement
Le préprocesseur gère les directives de préprocesseur, comme #include
et #define
. Il est agnostique de la syntaxe de C++, qui est pourquoi il doit être utilisé avec précaution.
Il travaille sur un fichier source C++ à un moment par le remplacement, #include
directives avec le contenu des différents fichiers (c'est en général des déclarations), de faire le remplacement de macros (#define
), et en sélectionnant les différentes portions de texte en fonction de l' #if
, #ifdef
et #ifndef
directives.
Le préprocesseur est de travailler sur un flux de prétraitement, jeton, et la substitution macro est définie comme le fait de remplacer les jetons par d'autres jetons (l'opérateur ##
permet de fusionner deux jetons lorsqu'il sens).
Après tout ce qu'il produit une sortie unique qui est un flux de jetons résultant des transformations décrites ci-dessus. Il ajoute également un des marqueurs qui indiquent au compilateur où chaque ligne est venu de sorte qu'il peut utiliser ceux de créer des messages d'erreur.
Certaines erreurs peuvent être produites à ce stade grâce à une utilisation intelligente de l' #if
et #error
directives.
Compilation
L'étape de compilation est effectuée sur chaque sortie du préprocesseur. Elle implique l'analyse du code source C++ (maintenant, sans les directives de préprocesseur) et, de produire un fichier objet. Ce fichier contient le code compilé (sous forme binaire) des symboles définis dans l'entrée. Symboles dans des fichiers objets sont désignés par le nom.
Les fichiers objets peut se référer à des symboles qui ne sont pas définis. C'est le cas lorsque vous utilisez une déclaration, et ne fournissent pas de définition. Le compilateur n'a pas l'esprit ce, et sera heureux de produire le fichier d'objet tant que le code source est bien formé.
Les compilateurs vont arrêter la compilation à ce point. Ceci est très utile car avec elle, vous pouvez compiler chaque fichier de code source séparément. L'avantage de cette offre est que vous n'avez pas besoin de recompiler le tout si vous modifiez uniquement un seul fichier.
Le produit objet de fichiers peuvent être mis dans des archives spéciales appelées bibliothèques statiques, pour faciliter la réutiliser plus tard.
C'est à ce stade de la "régulière" des erreurs du compilateur, comme des erreurs de syntaxe ou de l'échec de la résolution de surcharge des erreurs sont signalées.
La liaison
L'éditeur de liens est ce qui produit la compilation finale de sortie à partir des fichiers de l'objet, le compilateur produit. Cette sortie peut être soit partagé (ou dynamique) de la bibliothèque (et alors que le nom est similaire, ils n'ont pas beaucoup en commun avec les bibliothèques statiques mentionné plus haut) ou d'un fichier exécutable.
Il relie tous les fichiers de l'objet en remplaçant les références aux symboles non définis contenue dans ceux-ci avec les bonnes adresses. Chacun de ces symboles peuvent être définis dans d'autres fichiers de l'objet ou dans des bibliothèques. Si elles sont définies dans les bibliothèques autres que la bibliothèque standard, vous devez dire à l'éditeur de liens à leur sujet.
À ce stade, les erreurs les plus courantes sont le manque de définitions ou de dupliquer des définitions. L'ancien signifie que les définitions n'existent pas (c'est à dire qu'ils ne sont pas écrites), ou que l'objet des fichiers ou des bibliothèques où ils résident n'ont pas été donnés à l'éditeur de liens. Ce dernier est évidente: le même symbole a été défini dans deux différents fichiers objets ou des bibliothèques.