J'étais toujours confus au sujet des fichiers d'en-tête. Ils sont tellement étranges: vous incluez un fichier .h qui n'inclut pas .cpp mais .cpp sont en quelque sorte compilés aussi.
Récemment, j'ai rejoint un projet d'équipe et, bien sûr, les deux .h et .cpp sont utilisés.
Je comprends que cela est très important, mais je ne peux pas vivre avec le copier-coller de chaque déclaration de fonction dans chacune des multiples classes que nous avons.
Comment gérer efficacement la convention des 2 fichiers?
Existe-t-il des outils pour vous aider ou changer automatiquement un fichier qui ressemble à l'exemple ci-dessous en .h et .cpp? (spécifiquement pour MS VC ++ 2010)
class A
{
...
Type f(Type a,Type b)
{
//implementation here, not in another file!
}
...
};
Type f(Type a)
{
//implementation here
}
...
c++
language-design
naming
Oleh Prypin
la source
la source
Réponses:
Rédaction de C ++ plus convivial
En C ++, vous n'avez pas du tout besoin d'utiliser des en-têtes. Vous pouvez définir l'objet entier dans un seul fichier comme vous le feriez avec C # ou Java. Les développeurs C ne conserveront généralement les appels externes que dans un fichier d'en-tête. Tous les appels internes seraient définis dans le fichier .c. De la même manière, vous pouvez réserver vos fichiers C ++ .h pour les classes / interfaces (classes abstraites virtuelles pures) / etc. qui sont destinés à être partagés en dehors de la DLL. Pour les classes / structures / interfaces internes, etc., vous incluriez simplement le fichier .cpp dont vous avez besoin:
Cela ne semble pas être l'approche la plus populaire, mais c'est du C ++ légal. Ce serait certainement une possibilité pour tout votre code interne. Cela permet au code interne et à l'ensemble de classes de changer beaucoup plus radicalement tout en offrant une interface plus stable pour le code en dehors de votre bibliothèque / exécutable avec lequel interagir.
Le fait d'avoir toute votre classe dans un seul fichier vous permettra de faire plus facilement ce que vous voulez. Cela ne résoudra pas le problème de renommer une méthode et d'avoir à rechercher chaque endroit où cette méthode est appelée, mais cela vous assurera d'avoir des messages d'erreur plus intelligibles. Rien de pire que d'avoir votre en-tête déclarer une méthode dans un sens, mais vous l'implémentez différemment. L'autre code qui appelle le fichier d'en-tête se compilera correctement et vous obtiendrez une exception de lien, tandis que le fichier d'implémentation sera celui qui se plaint que la méthode n'a pas été définie. Lorsque vous définissez chaque méthode en place (dans la déclaration de classe réelle), vous obtiendrez le même message d'erreur quel que soit le fichier qui l'inclut.
Vous pouvez également vous pencher sur cette question: bons outils de refactoring pour C ++
Comment C / C ++ résout les fichiers d'en-tête / d'implémentation
Au niveau C de base (et C ++ est construit sur cette base), les fichiers d'en-tête déclarent la promesse d'une fonction / struct / variable qui est suffisante pour permettre à un compilateur de créer le fichier objet. De même, les fichiers d'en-tête C ++ déclarent la promesse de fonctions, de structures, de classes, etc. C'est cette définition que le compilateur utilise pour réserver de l'espace dans la pile, etc.
Les fichiers .c ou .cpp ont l'implémentation. Comme le compilateur convertit chaque fichier d'implémentation en un fichier objet, il existe des crochets pour les concepts non implémentés (ce qui a été déclaré dans l'en-tête). L'éditeur de liens lie les crochets aux implémentations dans d'autres fichiers objets et crée un binaire plus grand qui inclut tout le code (bibliothèque partagée ou exécutable).
VS spécifique
En ce qui concerne l'utilisation de ceux de Visual Studio, il existe des assistants qui facilitent un peu les choses. Le nouvel assistant de classe créera votre paire correspondante d'en-têtes et de fichiers d'implémentation. Il existe même une fonction de navigateur de classe qui vous permettra de déclarer de nouvelles méthodes. Il injectera la définition dans l'en-tête et le talon d'implémentation dans le fichier .cpp. Visual Studio possède ces fonctionnalités depuis plus d'une décennie (aussi longtemps que je les ai utilisées).
la source
Devenez développeur Java.
Si vous devez vraiment continuer à développer en C ++, vous pouvez essayer d'utiliser un IDE. Souvent, ils offrent un mécanisme par lequel vous pouvez ajouter une méthode à une classe, et il place automatiquement la déclaration dans le fichier .h et la définition dans le fichier .cpp.
la source
Vous pourriez être intéressé par le programme makeheaders de Hwaci (ceux qui font SQLite et Fossil).
Regardez également comment les fossiles sont construits pour avoir une idée.
la source
Lorsque vous écrivez les premières lignes d'une nouvelle classe, c'est généralement parce que vous en avez besoin au même endroit à ce moment-là. Plus tard, il pourrait être utilisé à plus d'endroits, mais initialement ce n'est généralement pas le cas.
Beaucoup de mes cours commencent en haut du fichier .cpp actuel. Quand il a suffisamment stabilisé pour l'utiliser à plusieurs endroits, je le coupe-collez dans un en-tête. Bien que souvent la classe disparaisse aussi vite qu'elle est apparue.
la source
Comme suggestion pour aider à gérer les fichiers d'en-tête C ++, il est courant de les utiliser sans extension de fichier ou suffixe de fichier, comme le font les bibliothèques "GCC".
Si tel est votre cas, je suggère d'utiliser une extension de fichier ou un suffixe de fichier " .hpp" (ou moins " .hxx").
Vous devrez peut-être configurer votre compilateur, l'environnement de développement ou le programme Built.
la source
#include <iostream>
? Ce ne sont pas seulement pour la bibliothèque GCC. En fait, il est défini dans la norme C ++ de 1997 , section 17.3.1.2. J'éviterais de nommer des fichiers comme ça. Vous pouvez, mais la raison pour laquelle la bibliothèque standard C ++ l'a fait était probablement pour éviter les conflits de noms. En fait, je trouve ça vraiment bizarre lorsque les compilateurs ajoutent automatiquement un «.h» lorsque vous incluez un en-tête, cela me semble assez standard. Et je ne vois jamais d'en-têtes de noms sans suffixe, à l'exception de la bibliothèque standard c ++.#include <someclass>
à être lu comme#include <someclass.hpp>
sur tous les compilateurs. Votre code va casser.