2016-12-15 2 views
0

Par exemple, j'ai une classe Foo. Je crée Foo.h, Foo.cpp puis j'inclue Foo.h dans le fichier main.cpp. Lorsque je compile le code, comment la machine sait-elle associer le fichier d'en-tête de la classe et le fichier cpp de la classe? Est-ce fait par les noms de fichiers?
Je suis vraiment intéressé à comprendre ce processus de compilation et de liaison.Comment le compilateur C++ (ou Linker?) Sait comment gérer les fichiers de classe cpp et en-tête?

+4

Les deux fichiers ne sont pas associés. Il n'y a pas besoin. Et ni le compilateur ni l'éditeur de liens n'incluent les fichiers inclus en tant que fichiers, car avant cela, l'étape du préprocesseur jette tout. – deviantfan

+1

Ce site est là pour répondre à des questions spécifiques sur les problèmes de code. Vous cherchez un tutoriel en C – kabanus

+0

Il n'associe aucun nom de fichier, il ne recherche que les noms de symboles. Votre 'main.o' aura des références aux symboles _declared_ dans' Foo.h', ces symboles sont _defined_ dans 'Foo.cpp' et seront donc trouvés dans' Foo.o' au moment de la liaison. – Useless

Répondre

3

Lorsque je compile le code, comment la machine sait-elle associer le fichier d'en-tête de classe et le fichier de classe cpp? le fait-il par le nom du fichier?

Non, il n'existe pas d'association automatique de ce type effectuée par le compilateur.

Si vous avez un fichier d'en-tête contenant toutes les déclarations de fonctions et de classes, il doit être #included à partir de n'importe quelle unité de traduction (fichier .cpp) qui l'utilise.
Cette étape (des contrats de déclaration) est effectuée par le préprocesseur c où chaque occurrence de #include "MyDeclarations.hpp" remplace celle avec le contenu du fichier complet de MyDeclarations.hpp dans l'unité de traduction.


Un exemple simple:

Foo.hpp

class Foo { 
public: 
     Foo(); // Constructor declaration 
}; 

foo.cpp

#include "Foo.hpp" // <<<< Include declarations 

Foo::Foo() {} // Constructor definition 

main.cpp

#include "Foo.hpp" // <<<< Include declarations 

int main() { 
     Foo foo; // <<<<< Use declarations 
} 

Pour charger enfin votre éditeur de liens Stich tous ces fichiers ensemble, vous devez vous référer aux objets produits à partir des unités de traduction . Selon la chaîne d'outils un peu, mais par ex. GCC vous pouvez utiliser une ligne de commande du compilateur comme

$ g++ main.cpp Foo.cpp -o myProg