2009-12-19 10 views
14

Wszelkie sugestie dotyczące jakości tagowania i wyszukiwania kodu w języku C++. Używam cscope/ctags dla większości rzeczy, ale uważam, że jest to niewystarczające, aby znaleźć sposób na zbyt skomplikowany kod C++ w pracy. Zacząłem przechodzić z vima na Slickedit (który wciąż nie jest doskonały, ale lepszy) do przeglądania kodu, ale chciałbym powrócić do wyłącznie vima.Kodowanie źródła C++

To, co chciałbym, to coś, co może zrozumieć zakres członków klasy, na przykład, jeśli szukam odniesień do członka klasy, gdzie ta sama nazwa członka istnieje w innych klasach (i prawdopodobnie poza kodem C++) da mi tylko odpowiednie referencje.

Wolałbym coś, co działa dobrze z vimem, ale jakikolwiek pakiet open source taki, że sam mógłbym stworzyć wtyczkę, byłby w porządku.

Wszelkie sugestie doceniane, dzięki.

+0

Mam ten sam problem przy użyciu ctags: używając polecenia ': Tags NamespaceName :: ClassName :: methodName' wszystko OK, ale oddanie kursor nad nazwą metody i wpisz' CTRL +] 'powiedzie zamiar niewłaściwej metody , Odkrywam, że używając 'g +]' pokazują listę znaczników niż możesz wybrać poprawne dopasowanie. Najlepsze dla mnie jest skrypt do analizy bieżącego kodu i poprawnego wywołania ': tag' –

Odpowiedz

0

Nie mam z tym żadnego doświadczenia, ale użyłem Doxygen do przeglądania kodu źródłowego złożonych projektów. Po prostu uruchom go z włączonymi wszystkimi ustawieniami i wygeneruje wykresy połączeń, wykresy wywołań, odniesienia i odniesienia według relacji, instancje szablonów itp. Formaty wyjściowe obejmują HTML, LaTeX, CHM, POD

Mam nadzieję, że to działa!

9

używać doxygen to świetne narzędzie do przeglądania kodu i zobacz klasy i relacje członków ze sobą. Narzędzie generuje klikalne wyjście html dla kodu źródłowego z referencjami dla każdego użycia. możesz go skompilować do przeszukiwanego pliku chm lub użyć serwera sieciowego do przeszukiwania kodu słów kluczowych.

0

Przez chwilę miksowałem różne narzędzia do tego celu. Vi jest świetnym edytorem i można go uruchomić na zdalnych komputerach bez kłopotów, ale informacje o ukończeniu nie są semantyczne.

W przypadku dużego problemu używam zarówno Eclipse CDT, jak i QTCreatora, w obu przypadkach najnowsze wersje, wersje sprzed roku, nie są tak ładne. QTCreator jest lekkim narzędziem, ale jestem pod wrażeniem jego zdolności do analizy kodu. Eclipse CDT ma większą wagę, ale jestem trochę bardziej przyzwyczajony do interfejsu, więc na koniec używam go.

Projekt, nad którym pracuję, jest kompilowany w oddzielnym obszarze izolowanym, gdzie nie można używać żadnego z tych dwóch IDE, ale można uzyskać kopię repozytorium tylko do analizy i używać IDE jako narzędzia do przeglądania.

25

Czy na pewno zadzwoniłeś do ctags z odpowiednimi opcjami? Dla C++, używam:

ctags --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++

To właśnie dokumentacja ma do powiedzenia na temat opcji --c++-kinds=+p:

podczas analizowania C++ definicję funkcji użytkownik (np "className :: funkcja" ), ctags nie może określić, czy specyfikator zakresu jest nazwą klasy lub specyfikatorem przestrzeni nazw i zawsze wymienia go jako nazwę klasy w części zakresu pól rozszerzeń. Ponadto, jeśli funkcja C++ jest zdefiniowana poza deklaracją klasy (zwykły przypadek), specyfikacja dostępu do danych (tj. Publiczna, chroniona lub prywatna) i (np. Wirtualna, czysta wirtualna) zawarta w deklaracji funkcji nie są znane, gdy znacznik jest generowany dla definicji funkcji .Będzie jednak dostępny dla prototypów
(np. - C++ - kinds = + p).

--fields=+iaS opcja:

a Access (or export) of class members 
i Inheritance information 
S Signature of routine (e.g. prototype or parameter list) 

--extra=+q opcja:

Ponieważ domyślnie ctags generuje znaczniki dla odrębnych identyfikatorów znajdujących się w plikach źródłowych tylko. Jeśli podasz opcję --extra = + q, to ​​ctags wygeneruje również drugą, kwalifikowaną klasę znacznika dla każdego elementu klasy (dane i funkcję/metodę) w klasie formula: :: member for C++, oraz w formularzu class.method dla Eiffela i Javy.

--language-force=C++ opcja:

Domyślnie Ctags automatycznie wybierze język pliku źródłowego, ignorując te pliki, których język nie może być ustalona (patrz pliki źródłowe, powyżej). Ta opcja wymusza użycie określonego języka (bez względu na wielkość liter, wbudowanego lub zdefiniowanego przez użytkownika) dla każdego dostarczonego pliku, zamiast automatycznego wybierania języka na podstawie jego rozszerzenia. Ponadto, specjalna wartość auto wskazuje, że język powinien być wybrany automatycznie (co skutecznie wyłącza tę opcję).

+1

Świetna odpowiedź, używam tego samego starego wiersza poleceń ctags od lat, mimo że teraz robię więcej C++. Chyba nigdy nie pomyślałem o przeczytaniu strony man i zobaczę, czy muszę dodać więcej opcji dla C++. Bardzo pomocne. – Dan

1

Spróbuj GNU globalnego http://www.gnu.org/software/global/

Może generować nawigacja: zdolnymi stron internetowych z kodu źródłowego, jak również o wsparcie dla vim i interfejs wiersza poleceń, który jest często użyteczne.