2009-09-10 6 views
25

J'ai un tas de fichiers d'en-tête C++ avec diverses déclarations de classe et de fonction. Jusqu'à présent, lorsque j'ai écrit les implémentations de fichiers source C++ des classes et des fonctions déclarées, j'ai été manuellement:Générer automatiquement le fichier C++ à partir de l'en-tête?

  1. Copie des déclarations du fichier d'en-tête dans le fichier source correspondant.
  2. Suppression de "class classname {" et la correspondance "};"
  3. Ajout de "classname ::" sur les noms de toutes les fonctions de classe.
  4. Remplacement des points-virgules après les déclarations de fonction par "{}".
  5. Suppression des mots-clés "virtuel" et "statique".

Seulement après tout ce travail, qui ne fait vraiment rien, puis-je réellement mettre en œuvre les fonctions. Je me demande s'il existe un outil quelque part qui peut générer automatiquement un fichier ".cpp" à partir d'un fichier ".h", où le ".cpp" résultant contient des stubs vides pour les fonctions déclarées dans le fichier ".h" (et pour lequel une définition inline n'a pas été donnée). Un outil de ligne de commande convivial pour UNIX serait préférable. Merci.

MISE À JOUR: Un outil multiplateforme serait idéal. Sinon, je travaille sur Mac OS X 10.6.

Répondre

21

Lazy C++ semble être conçu pour résoudre précisément ce problème.

+0

Lazy C++ ne semble pas être installable sur Mac OS X ... c'est ce que j'utilise. Y a-t-il des générateurs multiplateformes que vous connaissez qui peuvent être facilement construits à partir de la source? –

+1

+1 Ressource très intéressante. –

+1

@Michael: Vous pouvez récupérer la source et la compilation croisée pour OSX, voir par ex. répondez à http: // stackoverflow.com/questions/1375201/paresseux c-poulet-et-oeuf-problème – moonshadow

3

Le eclipse CDT dispose d'une fonctionnalité "Méthode d'implémentation" qui ne fait que cela (une méthode à la fois). Il existe également une fonctionnalité "Générer des Getters et Setters" qui génère également le code approprié dans les corps de la fonction.

+0

Merci. Je cherche une invocation de ligne de commande, cependant ... quelque chose que je peux utiliser dans une commande "find" pour générer récursivement des fichiers ".cpp" pour tous les fichiers d'en-tête de mon projet. –

5

Je me suis retrouvé dans votre situation dernièrement et j'ai créé mon propre outil - impl_me. C'est un petit script Ruby qui utilise SWIG en tant que backend parser. Il écrit sur stdout pour que vous puissiez combiner avec votre ensemble d'outils nix préféré find/grep/sed/awk pour modifier vos propres préférences. Parce qu'il est écrit en Ruby, il devrait être multi plate-forme. SWIG est également multi-plateforme donc tout devrait être OK.

Il est assez primitif à ce stade et n'est pas aussi robuste que Lazy C++ en termes d'analyse de modèles et d'objets étranges. Les contributions sont les bienvenues :)

0

J'ai essayé Lazy C++ mais il semble être obsolète et non plus maintenu. Il ne supporte pas non plus la dernière norme C++ 14.

C'est pourquoi j'ai décidé d'écrire mon propre outil en Java en utilisant ANTLR4. C'est ce qu'on appelle Score et vous pouvez le trouver ici: https://github.com/underrated/Score

Pour le moment, il est à ses débuts et pourrait être plein de bugs mais je prévois de l'améliorer. Alors essayez-le et signalez tout bogue sur la page github du projet. Je vais essayer de les réparer aussi vite que possible.

+0

Je ne m'attends pas à ce qu'il gère les conditionnels du préprocesseur pour le moment mais je prévois d'ajouter un support pour cela. A part ça, l'outil n'est pas destiné à faire des vérifications sémantiques sur le code. Il identifie simplement les implémentations de la méthode, puis place les prototypes de méthode dans l'en-tête et l'implémentation de la méthode dans le fichier source (plus quelques «séparations» supplémentaires). C'est au développeur d'assurer l'exactitude du code (par exemple en utilisant un IDE). Si le code original a des erreurs syntaxiques/sémantiques, il en sera de même pour le code généré. Mais ils peuvent être trouvés, soit par l'IDE ou par le compilateur. –

+0

@IraBaxter Pourquoi auriez-vous besoin d'une gestion aussi complexe des choses dans le contexte du problème de Michael? Tout ce dont il a besoin est d'automatiser la copie/coller/modifier un code. Un traitement spécial pour #ifdefs est en effet nécessaire. Les modèles n'ont pas besoin d'être touchés, ils peuvent rester dans l'en-tête. Les appels de macro seront vus comme des identifiants simples ou des appels de fonction par l'analyseur et n'ont pas besoin d'être touchés non plus. En ce qui concerne les espaces de noms, toutes les instructions "using ..." peuvent rester dans l'en-tête. Et le "namespace ... {...}" peut être copié à la fois l'en-tête et le fichier source. Est-ce que je manque quelque chose? –

Questions connexes