2009-12-19 19 views
14

Cualquier sugerencia sobre una forma de calidad para etiquetar y buscar código C++. Yo uso cscope/ctags para la mayoría de las cosas, pero me parece insuficiente para encontrar el camino para resolver algunos de los códigos de C++ demasiado complejos en el trabajo. He empezado a cambiar de vim a Slickedit (que aún no es perfecto, pero es mejor) para navegar por el código, pero me gustaría volver a vim exclusivamente.Etiquetado de fuente C++

Lo que me gustaría es algo que pueda entender el alcance de los miembros de la clase, por ejemplo, si busco referencias a un miembro de una clase donde existe el mismo nombre de miembro en otras clases (y posiblemente fuera del código C++) solo me dará las referencias relevantes.

Prefiero algo que ya funciona bien con vim, pero cualquier paquete de código abierto tal que pueda crear un plugin yo estaría bien.

Cualquier sugerencia apreciada, gracias.

+0

Tengo el mismo problema usando ctags: usando el comando ': tags NamespaceName :: ClassName :: methodName' todo bien, pero poniendo el cursor encima del nombre del método y tipo' CTRL +] 'falla al método incorrecto , Descubro que al usar 'g +]' muestran una lista de etiquetas que usted puede seleccionar la coincidencia correcta. Lo mejor para mí es un script para analizar el código actual y llamar correctamente a ': tag' –

Respuesta

0

No tengo experiencia con esto, pero he usado Doxygen para navegar por el código fuente de proyectos complejos. Simplemente ejecútelo con todas las configuraciones activadas, y generará gráficos de llamadas, gráficos de llamada, referencias y referencias por relaciones, instanciaciones de plantillas, etc. Los formatos de salida incluyen HTML, LaTeX, CHM, POD

¡Espero que esto funcione!

9

use doxygen es una gran herramienta para navegar por el código y ver las clases y las relaciones de los miembros entre sí. la herramienta produce salida html clicable para su código fuente con referencias para cada uso. puede compilarlo en un archivo chm con capacidad de búsqueda o usar un servidor web para buscar palabras clave en el código.

0

Durante un tiempo he estado mezclando diferentes herramientas para este propósito. Vi es un excelente editor y puede ejecutarlo en computadoras remotas sin problemas, pero la información de finalización no es semántica.

Cuando me enfrento a un gran problema tiendo a usar Eclipse CDT o QTCreator, en ambos casos las versiones más recientes, las versiones de un año atrás no son tan agradables. QTCreator es una herramienta liviana, pero he quedado bastante impresionado con su capacidad para analizar el código. Eclipse CDT pesa más, pero estoy un poco más acostumbrado a la interfaz, así que al final tiendo a usarla.

El proyecto en el que estoy trabajando está compilado dentro de un sandbox separado, donde ninguno de esos dos IDEs puede usarse, pero puede obtener una copia del repositorio solo para análisis y usar el IDE solo como una herramienta de exploración.

25

¿Seguro que llamaste ctags con las opciones correctas? Para C++, que utilizo:

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

Esto es lo que la documentación tiene que decir acerca de la opción --c++-kinds=+p:

Al analizar a ++ definición de la función miembro de C (por ejemplo "className :: función"), los ctags no pueden determinar si el especificador de alcance es un nombre de clase o un especificador de espacio de nombres y siempre lo enumera como un nombre de clase en la parte del alcance de los campos de extensión. Además, si se define una función C++ fuera de la declaración de clase (el caso habitual), la especificación de acceso (es decir, pública, protegida o privada) y información de implementación (por ej. Virtual, pura virtual) contenida en la declaración no se conocen cuando la etiqueta se genera para la definición de la función .Sin embargo, estará disponible para los prototipos
(por ejemplo, --C++ - tipos = + p).

La opción --fields=+iaS:

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

La opción --extra=+q:

Debido a que, por defecto, CTags sólo genera etiquetas para los identificadores separados que se encuentran en los archivos de origen. Si especifica la opción --extra = + q, ctags también generará una segunda etiqueta calificada de clase para cada miembro de clase (datos y función/método) en la clase de formulario :: miembro para C++, y en la forma class.method para Eiffel y Java.

La opción --language-force=C++:

Por defecto, CTags selecciona automáticamente el idioma de un archivo de origen, haciendo caso omiso de esos archivos cuyo idioma no puede ser determinada (ver archivos de código fuente, más arriba). Esta opción fuerza al idioma especificado (sin distinción entre mayúsculas y minúsculas, ya sea integrado o definido por el usuario) a ser utilizado para cada archivo suministrado en lugar de seleccionar automáticamente el idioma en función de su extensión. Además, el valor especial automático indica que el idioma debe seleccionarse automáticamente (lo que efectivamente desactiva esta opción).

+1

. Gran respuesta, he estado usando la misma línea de comando de ctags durante años, aunque ahora hago más C++. Supongo que nunca pensé en leer la página del manual y ver si necesitaba agregar más opciones para C++. Muy útil. – Dan

1

Trate GNU mundial http://www.gnu.org/software/global/

Puede generar navegar: páginas web capaces de su código fuente, así como contar con el apoyo de vim y una interfaz de línea de comandos que es a menudo útil.