Navegación de clases en C ++

7

Estoy trabajando con una gran base de código y, a menudo, encuentro que es tedioso y difícil de entender las relaciones de clase. Encontré el siguiente wiki que describe varias herramientas para trabajar con OOP en C ++, ¡pero están desactualizadas o no funcionan! ¿Qué herramientas de Emacs están disponibles para trabajar con grandes bases de código OO?

Esto es lo que he encontrado:

  • Navegador Orientado a Objetos
    • ¡No se ha actualizado desde 2002! Difunto
  • Ebrowse
    • Ni siquiera puedo encontrar un enlace de descarga para el analizador ... mi objetivo sería Windows o Mac OS X Gracias @ tu-do por señalar que está en el directorio bin de emacs
  • Emacs Code Browser
    • Solo parece admitir Etags, pero no etiquetas globales o cscope
descarado
fuente

Respuestas:

6

Estoy escribiendo una guía para Ebrowse y la publicaré esta semana. Ebrowse es un analizador rápido utilizado para procesar archivos fuente C ++ para producir una base de datos que contiene la jerarquía de clases que luego procesa Emacs para producir una representación de árbol de clases. Es algo así como GNU Global, pero está integrado en Emacs y produce un árbol de clases, por lo que tomará más tiempo procesarlo en un gran árbol fuente.

Para usar Ebrowse:

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

Agregue más extensión si lo desea. Si su proyecto solo tiene cientos de archivos, entonces = Ebrowse = funciona realmente bien. Después de ejecutar el comando, BROWSEse genera un archivo llamado ; Esta es la base de datos que contiene la jerarquía de clases. Simplemente abra este archivo y Emacs reconoce automáticamente el archivo y lo procesa. Después de terminar de procesar la base de datos, Emacs muestra un índice de todas las clases en la base de datos en un formato de árbol: si una clase se deriva de una clase, se anida dentro de la clase principal. Este búfer se llama a Tree buffer. Emacs proporciona tres formas de interactuar con Ebrowse:

  • Tree buffer: un buffer que muestra el árbol.
  • Memberbuffer: un buffer que muestra los miembros de cada clase. Puede alternar entre declaraciones y definiciones de una clase y saltar a la ubicación de cada una en el archivo fuente correspondiente.
  • Sourcebuffer: tu código buffer. Puede interactuar con la Ebrowse base de datos como buscar y ver (abierta para solo lectura) declaración y definición, abrir a = Miembro = búfer de una clase que contiene la etiqueta en el punto ...

Si tiene un proyecto grande (es decir, más de 10000 archivos cpp), pero todas las clases están en .harchivos, entonces no agregue .cppo de lo contrario tomaría mucho tiempo generar el BROWSEarchivo. Sin embargo, perderá la capacidad de cambiar a definición; pero esto se puede hacer usando ctagso GNU Global. Lo más importante es ver la jerarquía de clases Tree buffer, y esta es la ventaja de Ebrowse.

La guía WIP está aquí .

Actualización : Alternativamente, puede usar doxygen para generar todo tipo de gráficos (gráficos de llamante / llamado, gráficos de dependencia, gráficos de jerarquía de clases ...) pero también lleva mucho tiempo generar todos, incluso para árboles de origen pequeños como ipxe . Esto no doxygenes lento, de hecho está bastante optimizado, pero calcular la dependencia de toda la base de código no es una tarea trivial.

Bonificación : si trabaja con C y desea ver el gráfico de llamadas, use GNU Cflow. Vea mi respuesta de Reddit .

Tu Do
fuente
Esto puede sonar tonto, pero ¿dónde puedo encontrar el ejecutable "ebrowse"? ¿No está disponible para Windows o Mac OS X?
descarado el
@cheezy Se instala junto con Emacs. Entonces, si instala Emacs, debería estar en el bindirectorio que contiene Emacs. Entonces, si puede ejecutar emacsen la línea de comando, debería poder ejecutar ebrowse.
Tu Do
@cheezy por cierto, ¿la finalización funcionó para ti?
Tu Do
+1 puramente para la sintaxis Org. Ah, y supongo que la respuesta también es buena :)
Sean Allred
@SeanAllred woot no se dio cuenta de eso. Fijo :)
Tu Do
2

Puede tener una buena interfaz de timón para usar de forma interactiva cscope:

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

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

Entonces tenemos funciones como M-x helm-cscope-find-global-definitiondisponibles. La navegación es más rápida.

Ehvince
fuente
Pero, lo que quería era una visión general de la jerarquía de clases, no la navegación, y esto es exclusivo de Ebrowse, ya que la única herramienta de navegación viable que tenía para su proyecto es etags "
Tu Do
mmh, IMO (s) no solo busca una visión general de la jerarquía de clases (a pesar del título), sino que también está disponible para "herramientas [disponibles] para trabajar con grandes bases de código OO". cscopeayuda para eso (mejor que etags) y es la última palabra de su pregunta :)
Ehvince
Bueno, en su hilo anterior ya dijo que solo etagsse puede usar con el proyecto, a pesar de probar otras soluciones como GNU Global (que definitivamente es mejor que ctags). Pero para una jerarquía de clases, Eborwse o una herramienta externa como Doxygen es una opción viable. Y la primera oración es "Estoy trabajando con una gran base de código y, a menudo, encuentro que es tediosa y difícil de entender las relaciones de clase " :)
Tu Do
Oh, parece que te estás refiriendo a otro hilo (del que no estaba al tanto). cscopeayuda con las relaciones de clase porque podemos "encontrar quién llama a esta clase" y cosas así. ok, no estoy perfectamente en el tema, pero todavía tengo mi lugar :)
Ehvince