2011-05-04 16 views
21

Trabajo en un proyecto C/C++ de tamaño medio al que ya he aplicado Doxygen + Graphviz. Sus gráficos de encabezado son útiles, pero solo muestran relaciones basadas en #include. Estoy interesado en encontrar una herramienta (preferiblemente basada en Linux) que analice dependencias de archivos basadas no solo en #include, sino en el uso real de símbolos. Por ejemplo, tal herramienta no solo mostraría que a.cpp incluye b.h, sino que a.cpp usa SomeClass que está declarado en c.h incluido en b.h. También podría sugerir encabezado incluye que podría ser eliminado.Análisis de dependencia de encabezado "Profundo"

Respuesta

18

He usado Include What You Use antes con muy buenos resultados. Utiliza Clang para analizar el código de C++ y sugerir declaraciones forwards para agregar y archivos de encabezado para eliminar.

Una desventaja es que hace suposiciones sobre el diseño de su código, básicamente, los estándares de codificación de Google. Por lo tanto, solo verá SomeFile.h si tiene un archivo llamado SomeClass.cpp. También lo sugerido incluye usar rutas completas desde la raíz de su proyecto (por lo tanto, #include "src/SomeClass.h" en lugar de #include "SomeClass.h"). Al final, cambié mi código a esta convención de todos modos, ya que evita la ambigüedad, pero necesita un aviso en caso de que lo intentes.

Normalmente puede simplemente establecer CC=include-what-you-use y reconstruir para obtener los resultados - utiliza toda la maquinaria de clang para analizar -I incluir argumentos. Hay un programa python que usa el resultado para actualizar automáticamente tus # líneas de inclusión.

EDIT:

Otra herramienta que no es tan sofisticado, pero es más sencillo de instalar y puede sugerir #include s para eliminar es deheader. Funciona copiando su archivo C++ en una ubicación temporal, eliminando un #include y volviendo a compilar. Si la recompilación funciona, entonces es seguro eliminar ese archivo de encabezado. Lo que no hará es sugerir declaraciones anticipadas o algo sofisticado, pero puede reducir innecesariamente las líneas de inclusión en los archivos de implementación.

+0

Parece prometedor, aunque es un verdadero dolor que no tenga binarios para instalar. Y cuando comencé a compilar llvm, llenó mi disco duro hasta su capacidad. – Reinderien

+0

@Reinderien Un pago y una compilación de llvm + clang es "solo" alrededor de 1Gb, recuerde pasar --enable-optimized a la secuencia de comandos de configuración. Una compilación de depuración lo regresará a 4Gb. – richq

+0

Finalmente pude construir IWYU, y sí, es voluminoso, abultado, etc., pero es mejor que nada. Echaré un vistazo a Deheader, también. Gracias – Reinderien

Cuestiones relacionadas