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?
Répondre
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
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
Ce site est là pour répondre à des questions spécifiques sur les problèmes de code. Vous cherchez un tutoriel en C – kabanus
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