2009-07-13 12 views
1

J'ai reçu un paquet de fichiers C++ avec du code source statique (déjà développé, pas besoin de leur faire quoi que ce soit).Nombre d'arguments dans le fichier C++

Il existe un programme/lib/façon d'obtenir une liste du nombre de paramètres chaque fonction avec un de ces fichiers?

Je veux dire, obtenir un tel résultat:

#File a.cpp 
##a() -> 3 paramss 
##foo() -> 0 params (void) 

#File b.cpp 
##test() -> 1 param 

.... 

Et une meilleure question.

Il existe un moyen de traiter le nombre de retours dont il dispose?

#File a.cpp 
##a() -> 3 params, 1 return 
##foo() -> 0 params (void), 2 returns 

Par exemple, si « foo » a un retour si la condition est vraie et une autre si elle est fausse

Merci à l'avance.

+1

pouvez-vous fournir un exemple de 'foo()' tel qu'il a 2 retours? – SingleNegationElimination

+0

int foo() {if (blah) return 1; sinon retourner 0; } –

+0

comment obtenez-vous 2 retours en C++? –

Répondre

2

Vous pouvez essayer d'exécuter Doxygen sur les fichiers source.

Étant donné que le contenu est (sans doute) non documenté, vous devez configure doxygen pour extraire le contenu de fichiers non documentés.

Si vous souhaitez simplement parcourir la liste des fonctions disponibles, vous pouvez utiliser la sortie HTML.

Vous pouvez également configurer la sortie Doxygen pour qu'elle soit XML, puis écrire un analyseur pour extraire les statistiques que vous recherchez sur chaque fonction.

+0

Doxygen a bien fonctionné, générant les fichiers XML et HTML. J'ai seulement besoin d'analyser le xmll puis hehe;) – Ragnagard

0

Je compterais le nombre de "," et commencerais à 1. Cela devrait vous donner un compte précis du nombre d'arguments à une fonction. Ensuite, je vérifierais pour voir si "void" existe avant le nom de la fonction, sinon vous pouvez parier qu'il y a une valeur de retour.

ifstream infile; 
infile.open(...); 
int i, ret, args; 
String s; 

ret = args = 0; 
s = infile.getline(); 
for(i=0; s[i] != '('; i++) { 
if(s[i] == 'v' && s[i+1] == 'o' && s[i+2] == 'i' && s[i+3] == 'd') { 
    ret = 1; 
    break; 
} 
} 

for(i=0; s[i] != '('; i++) {} 

for(i; s[i] != ')'; i++) { 
if(args == 0 && s[i] != ' ') { 
    args++; 
} 
if(s[i] == ',') { 
    args++; 
} 
} 
+0

Comptage des virgules échouerait sur des choses telles que le modèle doSomething void (const SomeClass & thingy, const std :: string & other); –

+0

Vous avez raison, compter les virgules échouerait avec les templates en C++; le moyen le plus simple de le faire serait d'écrire une expression régulière pour le faire. – Suroot

+0

Le code a des modèles (et beaucoup d'em), donc je ne pourrais pas faire ceci hehe – Ragnagard

0

Tout cela est bien au-dessus, mais peut-être cela pourrait être votre tasse de thé, Elsa peut analyser C++ et vous fournir un arbre de syntaxe abstraite du fichier analysé. Il peut y avoir d'autres outils libres qui peuvent faire la même chose

+0

je peux essayer ceci quand j'obtiens les dépendances hehe – Ragnagard