2010-05-06 12 views
11

Que nous conservions du code inconnu ou que nous vérifiions les détails de mise en œuvre d'un module Apache, il peut être utile de parcourir rapidement le code et de dresser un aperçu de ce que nous re regarder. Grep répond à la plupart de mes besoins quotidiens, mais il y a des cas où cela ne suffira pas.Affichage des fonctions C/C++ (analyse de code sous Unix)

Voici un exemple courant de comment cela peut aider. Pour trouver la définition d'une fonction PHP Je suis intéressé je peux taper ceci à la ligne de commande:

grep -r "function myfunc" . 

Cela pourrait être adapté très rapidement à C ou C++ si nous savons le type de retour, mais les choses deviennent plus compliquée si, par exemple, je veux énumérer toutes les méthodes que ma classe fournit:

grep "function " ./src/mine.class.php 

Comme il n'y a pas de mot clé qui indique une fonction ou une méthode en C++ et parce qu'il est la syntaxe généralement plus complexe, je pense que je aurais besoin une sorte d'outil d'analyse de code statique, l'utilisation intelligente du préprocesseur C ou la foi aveugle le codeur a suivi des directives de code strictes (nombre d'espaces, position de curl ies etc) pour obtenir ce genre de résultats.

Que recommanderiez-vous?

Répondre

15

Exécutez-le via Doxygen. Il se plaindra de l'absence de commentaire, mais il produira toujours des graphiques d'appel et énumérera toutes les fonctions. Présenté en HTML avec des liens pour suivre les chemins de code.

doxygen

+2

+1 Vous devez également activer l'option générant le code source en HTML ("SOURCE BROWSER"). Le code résultant contiendra des liens hypertexte qui faciliteront la navigation dans le code source. –

+0

+1 Je viens de commencer à utiliser Doxygen pour générer des diagrammes en utilisant GraphViz pour m'aider à me souvenir du flux de données. –

9

Exubérant Ctags http://ctags.sourceforge.net/

Je ne l'ai utilisé de temps en temps il y a quelque temps, et à partir d'un éditeur de texte, mais vérifiez la liste des utilitaires/outils qui peuvent l'utiliser :

http://ctags.sourceforge.net/tools.html

+0

ctags est idéal pour étudier le nouveau code, et largement supporté par les IDE et les éditeurs. Allez dans le répertoire que vous regardez, exécutez 'ctags -R', lancez votre éditeur favori et sautez dans le code. Dans vim, vous utilisez 'ctrl-]' pour accéder à une définition et 'ctrl-t' pour revenir en arrière. – Winder

4

Doxygen est en mesure de générer une documentation HTML raisonnable et analyser des commentaires. Ce n'est pas parfait, mais ça pourrait aider. Vous pouvez incorporer Ctags dans votre éditeur pour vous rendre aux fonctions que vous recherchez.

Personnellement, j'utiliser grep;)

+0

J'utilise aussi grep sur mon propre projet quand j'ai besoin de trouver quelque chose ... mais un vrai IDE pour éditer le code ET avoir la déclaration/définition à portée de main est juste trop puissant pour laisser passer IMNSHO. –

+0

Pour les projets que je ne connais pas, je suis totalement d'accord qu'un IDE est fantastique. – Stephen

2

grep '^[a-zA-Z0-9][ *]+ {[a-zA-Z0-9_]+}\([a-zA-Z0-9\,\.\-\>]\*\)$'

est à peu près ce que vous voulez. Il peut prendre un peu de jeu avec, mais correspondre à un type de retour C++ valide, donner l'option d'être un pointeur, puis un nom de fonction (qui sera \ 1), ouvrir parenthèses, paramètres, fermer.

Cette forme générale (return, name, (param)) devrait fonctionner à moins que vous puissiez avoir des sauts de ligne dans une déclaration de fonction. J'utiliserais Doxygen ou un autre outil pour l'analyser, mais si vous avez besoin de le faire rapidement et une fois, regex pourrait être plus facile (ou pas, avec regex on ne sait jamais).

4

cscope est très bon pour ce genre de chose. Contrairement à ctags, cscope fournit une interface adaptée à la recherche (ctags nécessite un éditeur). Il suffit d'exécuter cscope dans le répertoire racine du code que vous voulez inspecter.Il: créer une base de données si l'on est pas là, mettez à jour la base de données si l'on est là, et ouvrir une malédictions où vous pouvez IUG interroger toutes sortes d'informations utiles

  • toutes les références à un symbole
  • mondiale définitions
  • fonctions appelées par une fonction
  • fonctions appelant une fonction
  • chaîne de texte
  • modèle d'expression régulière
  • un fichier
  • fichiers, y compris un fichier

ctags seulement le premier, «toutes les références à un symbole.