Quelle est la différence entre a.cpp fichier et fichier A. h?

Parce que j'ai fait .fichiers cpp puis transféré dans .h fichiers, la seule différence que je peux trouver est que vous ne pouvez pas #include .fichiers cpp. Y a-t-il une différence que je manque?

47
demandé sur Kent Fredric 2009-05-18 00:54:48

8 réponses

Le système de construction c++ (compilateur) ne connaît aucune différence, donc c'est une des conventions.

La convention est que .h fichiers sont des déclarations, et .fichiers cpp sont des définitions.

Voilà pourquoi .les fichiers h sont # inclus - nous incluons les déclarations.

45
répondu Macker 2009-05-17 20:57:28

Le .fichier cpp est l'unité de compilation : c'est le vrai fichier de code source qui sera compilé (en C++).

Le .les fichiers h (en-tête) sont des fichiers qui seront virtuellement copiés / collés dans le .fichiers cpp où l'instruction # include précompiler apparaît. Une fois que le code d'en-têtes est inséré dans le .code cpp, la compilation de la .rpc peut commencer.

20
répondu Klaim 2009-05-17 20:59:24

Je connais la différence entre une déclaration et une définition.

Considérant ce qui suit:

  • un fichier CPP inclut les définitions de n'importe quel en-tête qu'il inclut (car CPP et le fichier d'en-tête deviennent ensemble une seule "unité de traduction")
  • un fichier d'en-tête peut être inclus par Plus d'un fichier CPP
  • l'éditeur de liens n'aime généralement rien défini dans plus d'un fichier CPP

Par conséquent, toutes les définitions dans un fichier d'en-tête doivent être statique. Les fichiers d'en-tête contiennent également des déclarations qui sont utilisées par Plus d'un fichier CPP.

Les définitions qui ne sont ni statiques ni en ligne sont placées dans des fichiers CPP. En outre, toutes les déclarations qui ne sont nécessaires que dans un fichier CPP sont souvent placées dans ce fichier CPP lui-même, au lieu de dans n'importe quel fichier d'en-tête (partageable).

12
répondu ChrisW 2009-05-17 21:37:14

.les fichiers h, ou fichiers d'en-tête, sont utilisés pour lister les variables d'instance accessibles au public et les méthodes et dans la déclaration de classe. .les fichiers cpp, ou fichiers d'implémentation, sont utilisés pour implémenter réellement ces méthodes et utiliser ces variables d'instance.

La raison pour laquelle ils sont séparés est parce que .les fichiers h NE sont pas compilés en code binaire while .les fichiers cpp sont. Prenez une bibliothèque, par exemple. Dites que vous êtes l'auteur et que vous ne voulez pas qu'il soit open source. Donc vous distribuez le binaire compilé bibliothèque et les fichiers d'en-tête à vos clients. Cela leur permet de voir facilement toutes les informations sur les classes de votre bibliothèque qu'ils peuvent utiliser sans pouvoir voir comment vous avez implémenté ces méthodes. Ils sont plus pour les personnes qui utilisent votre code plutôt que le compilateur. Comme on l'a déjà dit: c'est la convention.

7
répondu Marc W 2009-05-17 21:00:17

Un en-tête (.h, .hpp, ... fichier contient

  • définitions de Classe ( class X { ... }; )
  • définitions de fonction En Ligne ( inline int get_cpus() { ... } )
  • déclarations de Fonction ( void help(); )
  • déclarations D'objet ( extern int debug_enabled; )

Un fichier source (.c, .cpp, .cxx) contient

  • définitions de fonction (void help() { ... } ou void X::f() { ... })
  • définitions D'objets ( int debug_enabled = 1; )

Cependant, la convention selon laquelle les en-têtes sont nommés avec un suffixe .h et une source les fichiers sont nommés avec un suffixe .cpp n'est pas vraiment nécessaire. On peut toujours dire à un bon compilateur comment traiter un fichier, quel que soit son suffixe de nom de fichier ( -x <file-type> pour gcc. Comme -x c++).

Les fichiers sources contiennent des définitions qui ne doivent être présentes qu'une seule fois dans l'ensemble du programme. Donc, si vous incluez un fichier source quelque part, puis liez le résultat de la compilation de ce fichier, puis celui du fichier source lui-même, alors bien sûr, vous obtiendrez des erreurs d'éditeur de liens, car vous ces définitions apparaissent deux fois: une Fois le fichier source, puis, dans le fichier inclus. C'est pourquoi vous avez eu des problèmes avec l'inclusion du fichier .cpp.

6
répondu Johannes Schaub - litb 2009-05-17 21:32:50

D'autres ont déjà offert de bonnes explications, mais j'ai pensé que je devrais clarifier les différences entre les différentes extensions:

  Source Files for C: .c
  Header Files for C: .h

  Source Files for C++: .cpp
  Header Files for C++: .hpp

Bien sûr, comme il a déjà été souligné, ce ne sont que des conventions. Le compilateur ne fait pas attention à eux - c'est purement pour le bénéfice du codeur.

1
répondu Noldorin 2009-05-17 21:04:03

Une bonne règle de base est ".les fichiers h doivent avoir des déclarations [potentiellement] utilisées par plusieurs fichiers source, mais aucun code n'est exécuté."

1
répondu dj_segfault 2009-05-17 21:13:55

Par convention .les fichiers h sont inclus par d'autres fichiers et ne sont jamais compilés directement par eux-mêmes. .les fichiers cpp sont-encore une fois, par convention-les racines du processus de compilation; ils comprennent .h fichiers directement ou indirectement, mais généralement pas .fichiers cpp.

0
répondu bdonlan 2009-05-17 20:57:22