71 votes

Codage C++ sans en-tête, meilleures pratiques ?

Lorsque j'ai appris le c++, j'avais déjà codé dans de nombreux autres langages auparavant, ce qui rendait la perspective des en-têtes vraiment déprimante. Jusqu'à présent, ma solution pour coder sans fichiers d'en-tête en c++ a été loin d'être optimale, limitant ce que je peux faire dans ce langage.

Existe-t-il un moyen de ne pas avoir à écrire deux fois les déclarations de fonctions (en-têtes) tout en conservant la même extensibilité à la compilation, la même clarté au débogage et la même flexibilité à la conception ?

donc : Est-il possible de coder en C++ sans en-tête ? Si oui, comment ?

65voto

Richard Corden Points 12292

Utilisez lzz . Il prend un seul fichier et crée automatiquement un .h et un .cpp pour vous avec toutes les déclarations/définitions au bon endroit.

lzz est vraiment très puissant, et gère 99% de la syntaxe C++ complète, y compris les templates, les spécialisations etc etc etc.

42voto

rix0rrr Points 4924

J'ai ressenti la même chose quand j'ai commencé à écrire C, alors je me suis aussi penché sur la question. La réponse est que oui, c'est possible et non, vous ne voulez pas le faire.

D'abord avec le oui.

Dans GCC, vous pouvez faire cela :

// foo.cph

void foo();

#if __INCLUDE_LEVEL__ == 0
void foo() {
   printf("Hello World!\n");
}
#endif

Cela a l'effet escompté : vous combinez l'en-tête et la source en un seul fichier qui peut être inclus et lié.

Ensuite, avec le non :

Cela ne fonctionne que si le compilateur a accès à l'intégralité de la source. Vous ne pouvez pas utiliser cette astuce lorsque vous écrivez une bibliothèque que vous voulez distribuer mais garder en source fermée. Soit vous distribuez le fichier .cph complet, soit vous devez écrire un fichier .h séparé pour accompagner votre .lib. Bien que vous puissiez peut-être le générer automatiquement avec le préprocesseur macro. Mais ce serait difficile.

Et la raison n°2 pour laquelle tu ne veux pas de ça, et c'est probablement la meilleure : vitesse de compilation . Normalement, les fichiers sources C ne doivent être recompilés que lorsque le fichier lui-même est modifié, ou lorsque l'un des fichiers qu'il inclut est modifié.

  • Le fichier C peut changer fréquemment, mais le changement n'implique que la recompilation du seul fichier qui a changé.
  • Les fichiers d'en-tête définissent les interfaces, ils ne devraient donc pas changer aussi souvent. Cependant, lorsqu'ils changent, ils déclenchent une recompilation de l'application chaque fichier source qui les inclut.

Lorsque tous vos fichiers sont des fichiers d'en-tête et des fichiers source combinés, chaque modification déclenche une recompilation de tous les fichiers source. Le C++ n'est pas connu pour ses temps de compilation rapides, même maintenant, imaginez ce qui se passerait si le projet entier devait être recompilé à chaque fois. Puis extrapolez cela à un projet de centaines de fichiers sources avec des dépendances compliquées...

30voto

ojrac Points 6897

Désolé, mais il n'existe pas de "meilleure pratique" pour éliminer les en-têtes en C++ : c'est une mauvaise idée, point final. Si vous les détestez à ce point, vous avez trois choix :

  • Familiarisez-vous avec les mécanismes internes du C++ et les compilateurs que vous utilisez ; vous rencontrerez des problèmes différents de ceux du développeur C++ moyen, et vous devrez probablement les résoudre sans beaucoup d'aide.
  • Choisissez une langue que vous pouvez utiliser "correctement" sans être déprimé.
  • Utilisez un outil qui les génère pour vous ; vous aurez toujours des en-têtes, mais vous économiserez un peu de temps de saisie.

11voto

Daniel Daranas Points 15123

Dans son article Prise en charge simple de la conception par contrat en C++ Pedro Guerreiro a déclaré :

Habituellement, une classe C++ se présente sous la forme de deux fichiers : le fichier d'en-tête et le fichier de définition. Où devrions-nous écrire les assertions : dans le fichier d'en-tête, parce que les assertions sont des spécifications ? Ou dans le fichier de définition, puisqu'elles sont exécutables ? Ou dans les deux, en courant le risque d'incohérence (et dupliquer le travail) ? Nous recommandons, au lieu de cela, que nous abandonnions le style traditionnel, et de supprimer le fichier le fichier de définition, en utilisant uniquement le fichier d'en-tête, comme si toutes les fonctions étaient définies en ligne, comme le font Java et Eiffel.

C'est un changement si drastique par rapport à la normalité du C++ qu'il risque de tuer l'entreprise dès le dès le départ. D'un autre côté, maintenir deux fichiers pour chaque classe est si gênant que tôt ou tard, un environnement de développement apparaîtra qui nous cachera cela, nous permettant de nous concentrer sur nos classes, sans sans avoir à se soucier de l'endroit où elles sont stockées.

C'était en 2001. J'ai accepté. Nous sommes maintenant en 2009 et il n'y a toujours pas d'environnement de développement qui nous cache cela, nous permettant de nous concentrer sur nos classes. Au lieu de cela, les longs temps de compilation sont la norme.

Heureusement, nous avons maintenant C#, où nous pouvons profiter de l'absence de fichiers d'en-tête... et de longs temps de compilation :)


Note : Le lien ci-dessus semble être mort maintenant. Il s'agit de la référence complète à la publication, telle qu'elle apparaît dans le site Web de la Commission européenne. Publications de l'auteur site web :

Pedro Guerreiro, Simple Support for Design by Contract in C++, TOOLS USA 2001, Proceedings, pages 24-34, IEEE, 2001.

8voto

Nils Pipenbrinck Points 41006

Il n'existe aucun moyen pratique de contourner les en-têtes. La seule chose que vous pouvez faire est de mettre tout le code dans un grand fichier c++. Cela aboutira à un désordre impossible à maîtriser, alors ne le faites pas.

Pour l'instant, les fichiers d'en-tête C++ sont un mal nécessaire. Je ne les aime pas, mais il n'y a aucun moyen de les contourner. J'aimerais bien voir des améliorations et des idées nouvelles sur ce problème.

Btw - une fois que vous vous êtes habitué, ce n'est pas que plus mauvais.. Le C++ (et n'importe quel autre langage aussi) a des choses plus ennuyeuses.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X