2010-05-06 10 views
11

Niezależnie od tego, czy zachowujemy nieznany kod, czy sprawdzamy szczegóły implementacji modułu Apache, może pomóc, jeśli szybko przejdziemy przez kod i zbudujemy przegląd tego, co mamy ". ponowne spojrzenie. Grep spełnia większość moich codziennych potrzeb, ale są pewne przypadki, w których po prostu tego nie robi.Lista funkcji C/C++ (Analiza kodu w systemie Unix)

Oto typowy przykład, w jaki sposób może pomóc. Aby znaleźć definicję funkcji PHP Jestem zainteresowany mogę wpisać w linii poleceń:

grep -r "function myfunc" . 

To może być przystosowana bardzo szybko do C lub C++, jeśli wiemy, typ zwracany, ale rzeczy stają się bardziej skomplikowany jeśli, powiedzmy, chcę wymienić każdą metodę, że moja klasa stanowi:

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

ponieważ nie ma jednego słowa kluczowego, które oznacza funkcję lub metodę w C++, a ponieważ jest ogólnie bardziej złożona składnia, myślę, że trzeba rodzaj statycznego narzędzia do analizy kodu, inteligentne użycie preprocesora C lub ślepa wiara, że ​​koder postępuje zgodnie ze ścisłymi wytycznymi dotyczącymi kodu (liczba białych znaków, pozycja curl itp.), aby uzyskać tego rodzaju wyniki.

Co byś polecił?

Odpowiedz

15

Przeprowadź przez Doxygen. Będzie skarżył się na brak komentarzy, ale nadal będzie generował wykresy połączeń i wyświetlał listę wszystkich funkcji. Prezentowane w HTML z linkami do śledzenia ścieżek kodu.

doxygen

+2

+1 Należy również włączyć opcję generującą wynik kodu źródłowego w HTML ("PRZEGLĄDARKA SOURCE"). Powstały kod będzie zawierał hiperłącza, dzięki którym nawigacja po kodzie źródłowym stanie się prosta. –

+0

+1 Właśnie zacząłem używać Doxygen do generowania diagramów za pomocą GraphViz, aby pomóc mi zapamiętać przepływ danych. –

9

Żywiołowy Ctags http://ctags.sourceforge.net/

Używałem go tylko od czasu do czasu jakiś czas temu, a od wewnątrz edytora tekstu, ale sprawdzić listę narzędzi/narzędzi, które mogą z niego korzystać :

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

+0

ctags jest świetny do badania nowego kodu i szeroko wspierany przez IDE i redaktorów. Przejdź do katalogu, którego szukasz, uruchom 'ctags -R', uruchom swój ulubiony edytor i przeskocz wokół kodu. W vimie używasz 'ctrl-]', aby przejść do definicji i 'ctrl-t' aby odskoczyć. – Winder

4

Doxygen jest w stanie wygenerować wystarczającą dokumentację HTML i przetwarza się komentarze. Nie jest doskonały, ale może pomóc. Możesz wprowadzić Ctags do swojego edytora, aby przeskoczyć do funkcji, których szukasz.

Osobiście używam grep;)

+0

Używam również grep na moim własnym projekcie, gdy potrzebuję znaleźć coś ... ale prawdziwe IDE, aby edytować kod I mieć deklarację/definicję po prostu za daleko jest zbyt potężne, aby przepuścić IMNSHO. –

+0

W przypadku projektów, które nie są mi znane, całkowicie zgadzam się, że IDE jest fantastyczne. – Stephen

2

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

jest mniej więcej to, co chcesz. Może to zająć trochę gry, ale dopasować poprawny typ zwracanego C++, dać opcję będącą wskaźnikiem, a następnie nazwę funkcji (która będzie \ 1), otworzyć nawiasy, parametry, zamknąć.

Ten ogólny formularz (return, name, (param)) powinien działać, chyba że w deklaracji funkcji mogą występować przerwy linii.

Używałbym Doxygen lub innego narzędzia do analizowania tego, ale jeśli chcesz zrobić to szybko i raz, wyrażenie regularne może być łatwiejsze (lub może nie, z regex nigdy nie wiadomo).

4

cscope jest bardzo dobre dla tego rodzaju rzeczy. W przeciwieństwie do ctags, cscope zapewnia interfejs odpowiedni do wyszukiwania (ctags wymaga edytora).

Wystarczy uruchomić cscope w katalogu głównym kodu, który chcesz sprawdzić.Będzie to: stworzenie bazy danych, jeśli nie istnieje, aktualizuje bazę danych, jeśli jest tam, i otworzyć curses GUI, gdzie można zbadać wszystkie rodzaje użytecznych informacji

  • wszystkie odwołania do symbolu
  • globalnym definicje
  • funkcje wywoływane przez funkcję
  • funkcje Wywołanie funkcji
  • łańcuch tekstowy
  • regularny wzór ekspresji
  • plikiem
  • pliki zawierające pliki

ctags tylko robi pierwszy „wszystkie odniesienia do symbolu”.