2012-03-27 21 views
8

Ecco un problema che ho avuto di recente che deve essere un dolore comune per gli altri qui.Come posso cercare rapidamente tutti i file di intestazione inclusi in un progetto per una funzione o una macro specifica?

Sto lavorando con il codice C legacy di qualcun altro e ho bisogno di trovare dove è stata definita una funzione o una macro. Il codice #include è un insieme di diverse librerie di sistema standard oltre a quelle del progetto specifico.

C'è uno strumento o una tecnica per trovare rapidamente dove è stata definita una funzione specifica, macro (o altro globale per quella materia)?

ho provato:

grep -R 'function' /usr/lib 

e altri simili * nix/bash-fu con successo solo limitata e un sacco di pula fastidioso per abbattere. Uno di voi codificatori saggio là fuori deve avere una buona soluzione per questo scenario apparentemente comune.

Sono stato molto sorpreso di non trovare un'altra domanda su questo particolare dolore qui o nelle mie ricerche dell'interwebs. (Sono sicuro che ci saranno commenti arrabbiati se ne ho perso uno ... ;-))

Grazie in anticipo per eventuali suggerimenti!

+1

Abbiamo una combinazione di Opengrok e Doxygen, che aiuta un po ... – BoBTFish

risposta

4

Usa etags/ctags dal exuberant ctags project in combinazione con un editor (Emacs, vim), che li capisce, o GNU GLOBAL.

Oh, e se capita di utilizzare automake genera un target TAGS. Quindi nessuna necessità di complicate chiamate manuali a {c,e}tags.

+0

Grazie. Sebbene avessi usato i ctags in precedenza, non mi ero reso conto che potevo usarli per le librerie di sistema esistenti. Mi piace la capacità di GNU GLOBAL di mostrare anche le istanze di una funzione (cioè la mappatura inversa di ciò che fa CTAGS). – JJC

1

Utilizzare ctags/cscope + vim/emacs

si può google per il loro uso particolare.

se si utilizza ctags + vim, è possibile:

1.Go alla directory /usr/include, excute ctags -f tags1 -R . generare i tag

tag 2.generate per il codice nella directory di codice ctags -f tags2 -R.

3.run :set path+=tags1,tags2 in vim

4.Under una funzione o marco provare CTRL+]

0

vim + ctags è la strada da percorrere. È possibile passare alla definizione delle funzioni e, variabili globali, macro, ecc ecc

FYI, browsing programs with tags

Inoltre, se si desidera velocemente passare tra .c e .h, si prega di fare riferimento al this blog

0

è possibile utilizzare cscope o emacs/vim + xcscope.el per farlo facilmente.Penso che sia pastella di ctage ed etage.

0

Se sono incluse le intestazioni corrette che definiscono direttamente o indirettamente ciò che si cerca, la maggior parte degli IDE ha una funzionalità di salto a definizione che funziona.

I tag-approcci sono ovviamente carini perché non dipendono da intestazioni correttamente incluse.

1

Ecco cosa si può fare, supponendo che si usi gcc, se non si modifica semplicemente di conseguenza.

gcc -E myfile.c | grep '^#' | cut -f 3 -d ' ' | sort |uniq | xargs -n 1 grep -l "MYMACROORFUNCTIONNAME" 
Problemi correlati