c++ c header dependencies

c++ - Análisis de dependencia de encabezado "profundo"



header dependencies (1)

Trabajo en un proyecto de C / C ++ de tamaño mediano 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 las dependencias de archivos basadas no solo en #include , sino en el uso real de los símbolos. Por ejemplo, tal herramienta no solo mostraría que a.cpp incluye bh , sino que a.cpp usa SomeClass que está declarada en ch incluida por bh . También sería capaz de sugerir encabezados que podrían ser eliminados.


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

Un inconveniente 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 . Además, lo sugerido incluye el uso de rutas completas desde la raíz de su proyecto (por lo que #include "src/SomeClass.h" lugar de #include "SomeClass.h" ). Al final, de todos modos, cambié mi código a esta convención, ya que evita la ambigüedad, pero necesita un aviso en caso de que lo intentes.

Por lo general, puede simplemente configurar CC=include-what-you-use y reconstruir para obtener los resultados: utiliza toda la maquinaria de análisis para analizar los elementos. Hay un programa de Python que usa el resultado para actualizar automáticamente tus líneas de #incluir.

EDITAR:

Otra herramienta que no es tan sofisticada, pero es más sencilla de configurar y puede sugerir que #include s para eliminarla es el deheader . Funciona al copiar su archivo C ++ en una ubicación temporal, eliminando un #include y recompilando. Si la recompilación funciona, entonces es seguro eliminar ese archivo de encabezado. Lo que no hará es sugerir declaraciones a futuro o cualquier cosa sofisticada, pero puede reducir las innecesarias líneas de inclusión en sus archivos de implementación.