Navegação de classe em C ++

7

Estou trabalhando com uma grande base de código e muitas vezes acho que é entediante e difícil de entender os relacionamentos de classe. Encontrei o wiki a seguir que descreve várias ferramentas para trabalhar com OOP em C ++, mas elas estão desatualizadas ou não funcionam! Quais ferramentas Emacs estão disponíveis para trabalhar com grandes bases de código OO?

Aqui está o que eu encontrei:

  • Navegador Orientado a Objetos
    • Não foi atualizado desde 2002! Extinta
  • Ebrowse
    • Não consigo nem encontrar um link de download para o analisador ... meu destino seria Windows ou Mac OS X Obrigado @ tu-do por apontar que está no diretório emacs bin
  • Emacs Code Browser
    • Parece apenas suportar Etags, mas não tags globais ou cscope
cheezy
fonte

Respostas:

6

Estou escrevendo um guia para o Ebrowse e o lançarei nesta semana.Ebrowse é um analisador rápido usado para processar arquivos de origem C ++ para produzir um banco de dados que contém a hierarquia de classes que é processada posteriormente pelo Emacs para produzir uma representação da árvore de classes. É um pouco como o GNU Global, mas é embutido no Emacs e produz uma árvore de classes, portanto, levará mais tempo para processar na grande árvore de origem.

Para usar o Ebrowse:

find . -name '*.cpp' -or -name '*.h' | ebrowse

Adicione mais extensões, se quiser. Se o seu projeto tiver apenas centenas de arquivos, então = Ebrowse = funciona muito bem. Depois de executar o comando, um arquivo chamado BROWSEé gerado; esse é o banco de dados que contém a hierarquia de classes. Simplesmente abra este arquivo e o Emacs o reconhece e processa automaticamente. Após o processamento do banco de dados, o Emacs exibe um índice de todas as classes no banco de dados em formato de árvore: se uma classe é derivada de uma classe, ela é aninhada dentro da classe pai. Esse buffer é chamado de Tree buffer. O Emacs fornece três maneiras de interagir Ebrowse:

  • Tree buffer: um buffer que exibe a árvore.
  • Memberbuffer: um buffer que exibe membros de cada classe. Você pode alternar entre declarações e definições de uma classe e pular para o local de cada uma no arquivo de origem correspondente.
  • Sourcebuffer: seu buffer de código. Você pode interagir com o Ebrowse banco de dados, como encontrar e visualizar declarações e definições (abertas para somente leitura), abrir um = Member = buffer de uma classe que contém a tag no ponto ...

Se você tem um projeto grande (ou seja, mais de 10000 arquivos cpp), mas todas as classes estão em .harquivos, não adicione, .cppou então levaria muito tempo para gerar o BROWSEarquivo. Você perderá a capacidade de mudar para a definição; mas isso pode ser feito usando ctagsou GNU Global. O mais importante é visualizar a hierarquia de classes Tree buffere essa é a vantagem do Ebrowse.

O guia WIP está aqui .

Atualização : Como alternativa, você pode usar o doxygen para gerar todos os tipos de gráficos (gráficos de chamadas / chamadas, gráficos de dependência, gráficos de hierarquia de classes ...), mas também leva muito tempo para gerar tudo, mesmo para pequenas árvores de origem como o ipxe . Isso não doxygené lento, na verdade, é bastante otimizado, mas calcular a dependência para toda a base de código não é uma tarefa trivial.

Bônus : Se você trabalha com C e deseja ver o gráfico de chamadas, use o GNU Cflow. Veja meu reddit reddit .

Tu Do
fonte
Isso pode parecer bobagem, mas onde posso encontrar o executável "ebrowse"? Não está disponível para Windows ou Mac OS X?
cheezy
@cheezy Ele é instalado junto com o Emacs. Portanto, se você instalar o Emacs, ele deverá estar no bindiretório que contém o Emacs. Portanto, se você puder executar emacsna linha de comando, poderá executar ebrowse.
Tu Do
@cheezy btw, a conclusão funcionou para você?
Tu Do
+1 apenas para a sintaxe da organização. Oh, e eu acho que a resposta é boa, também :)
Sean Allred
@SeanAllred woot não percebeu isso. Corrigido :)
Tu Do
2

Você pode ter uma boa interface de comando para usar interativamente cscope:

http://wikemacs.org/wiki/Python#Indexing_sources:_ctags.2C_cscope.2C_pycscope

https://github.com/sergey-pashaev/helm-cscope

Em seguida, temos funções como M-x helm-cscope-find-global-definitiondisponíveis. A navegação é mais rápida.

Ehvince
fonte
Mas, o que ele queria era uma visão geral da hierarquia de classes, não da navegação, e isso é exclusivo do Ebrowse, já que a única ferramenta de navegação viável que ele tinha para o projeto é etags “Criando tabela de conclusão de tags” Congelamentos / blocos - como desativar
Tu Do
mmh, IMO (s) ele não apenas procura uma visão geral da hierarquia de classes (apesar do título), mas também "ferramentas [estão] disponíveis para trabalhar com grandes bases de código OO". cscopeajuda para que (melhor do que etags) e é a última palavra da sua pergunta :)
Ehvince
Bem, em seu tópico anterior, ele já declarou que só etagsé utilizável no projeto, apesar de tentar outras soluções como o GNU Global (que é definitivamente melhor que ctags). Mas para uma hierarquia de classes, o Eborwse ou uma ferramenta externa como o Doxygen é uma opção viável. E a primeira frase é "Eu estou trabalhando com uma grande base de código e, muitas vezes encontrá-lo para ser tedioso e difícil de entender relações de classe " :)
Tu Do
Ah, parece que você está se referindo a outro tópico (do qual eu não estava ciente). cscopeajuda nas relações de classe porque podemos "encontrar quem chama essa classe" e coisas assim. ok, eu não estou perfeitamente no assunto, mas ainda tenho o meu lugar :)
Ehvince