Explication détaillée des fichiers d'en-tête et des fichiers source dans C ++
1. Mode de compilation C ++
Généralement, dans un programme C ++, il n'y a que deux types de fichiers. Parmi eux, le fichier .cpp est appelé le fichier source C ++, et le code source de C ++ y est placé; tandis que le fichier .h est appelé le fichier d'en-tête C ++ et que le code source de C ++ y est placé.
La langue C ++ prend en charge la "compilation séparée". En d'autres termes, tous les contenus d'un programme peuvent être divisés en différentes parties et placés dans différents fichiers .cpp. Les choses dans le fichier .cpp sont relativement indépendantes. Lors de la compilation (compiler), vous n'avez pas besoin de communiquer avec d'autres fichiers. Il vous suffit de créer un lien avec d'autres fichiers cibles après l'avoir compilé dans le fichier cible. Par exemple, une fonction globale "void a () {}" est définie dans le fichier a.cpp, et cette fonction doit être appelée dans le fichier b.cpp. Malgré cela, les fichiers A.CPP et B.CPP n'ont pas besoin de connaître l'existence de l'autre, mais peuvent les compiler séparément. Après les avoir compilés dans le fichier cible, liez-les et l'ensemble du programme peut être exécuté.
Comment cela est-il réalisé? Du point de vue des programmes d'écriture, c'est très simple. Dans le fichier B.CPP, avant d'appeler la fonction "void a ()", déclarez la fonction "void a ();" d'abord. En effet, le compilateur générera une table de symboles lors de la compilation de B.CPP. Des symboles comme "void a ()" qui ne peuvent pas être vus seront stockés dans ce tableau. Lors du lien à nouveau, le compilateur recherchera la définition de ce symbole dans d'autres fichiers d'objets. Une fois trouvé, le programme peut être généré en douceur.
Notez qu'il y a deux concepts mentionnés ici, l'un est "définition" et l'autre est "Déclaration". En termes simples, "définition" signifie décrire un symbole d'une manière complète et complète: qu'il s'agisse d'une variable ou d'une fonction, quel type il renvoie, de quels paramètres il a besoin, etc. "Déclaration" déclare simplement l'existence de ce symbole, c'est-à-dire, dit au compilateur que ce symbole est défini dans d'autres fichiers. Je vais l'utiliser en premier. Lorsque vous liez, allez dans un autre endroit pour savoir de quoi il s'agit. Lors de la définition, vous devez définir complètement un symbole (variable ou fonction) en fonction de la syntaxe C ++, et lors de la déclaration, vous n'avez qu'à écrire le prototype de ce symbole. Il convient de noter qu'un symbole peut être déclaré plusieurs fois tout au long du programme, mais ne doit être défini qu'une seule fois. Imaginez-vous, s'il y a deux définitions différentes d'un symbole, qui devrait écouter le compilateur?
Ce mécanisme apporte de nombreux avantages aux programmeurs C ++ et conduit également à une méthode d'écriture de programmes. Considérez que s'il existe une fonction très couramment utilisée "void f () {}" qui sera appelée dans de nombreux fichiers .cpp dans l'ensemble du programme, nous n'avons qu'à définir cette fonction dans un seul fichier et à déclarer cette fonction dans d'autres fichiers. Une fonction est facile à gérer, et cela signifie seulement une phrase pour le déclarer. Cependant, que se passe-t-il s'il y a trop de fonctions, comme un tas de fonctions mathématiques, il y en a des centaines? Chaque programmeur peut-il être sûr d'écrire avec précision et d'écrire toutes les fonctions sous la forme?
2. Qu'est-ce qu'un fichier d'en-tête
De toute évidence, la réponse est impossible. Mais il existe un moyen très simple d'aider les programmeurs à économiser la peine de se souvenir de tant de prototypes de fonctions: nous pouvons écrire toutes les instructions de déclaration de centaines de fonctions d'abord et les mettre dans un fichier. Lorsque le programmeur en a besoin, copiez toutes ces choses dans son code source.