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
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.
- 1. Dependencia del encabezado en automake
- 2. dependencia cíclica entre los archivos de encabezado
- 3. ¿Existe una buena herramienta de análisis de dependencia para Python?
- 4. ¿Existen límites respecto a qué tan profundo puede anidar la inclusión de encabezado?
- 5. clon profundo recomendación utilidad
- 6. iOS 5 de prevención de sueño profundo
- 7. Análisis del encabezado FLV (duración) del archivo remoto en Java
- 8. Rails 3 enrutamiento: Evitar profundo de anidamiento
- 9. Reverso profundo de listas anidadas en Scala
- 10. Colección de Zoom profundo en JavaScript Canvas
- 11. Nivel de pila demasiado profundo en Ruby
- 12. SystemStackError (nivel de pila demasiado profundo)
- 13. rieles: nivel de pila muy profundo
- 14. Funciones de anidamiento profundo en JavaScript
- 15. ¡rake abortado! nivel de pila demasiado profundo
- 16. Enlace profundo de Android en una aplicación
- 17. profundo de reflexión es igual a comparar
- 18. Profundo puede apilarse con yesod
- 19. Comprender dict.copy() - superficial o profundo?
- 20. Inyección de dependencia sin marco
- 21. Prueba de unidad de dependencia de código
- 22. Dependencia de Maven dentro de la dependencia con diferente alcance
- 23. Requerir dependencia de otra dependencia en los módulos de nodo
- 24. Inyectando el Inyector de Dependencia usando la Inyección de Dependencia
- 25. IndexOutOfRangeException lo profundo de las entrañas de NHibernate
- 26. Arreglo recursivo profundo de estructura de directorios en PHP
- 27. Rails 3.1 anidamiento profundo con RABL
- 28. ¿Cuán profundo funcionan los compiladores en línea?
- 29. documento clon profundo con asociaciones incrustados
- 30. ¿Es un diccionario anidado profundo un antipatrón?
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
@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
Finalmente pude construir IWYU, y sí, es voluminoso, abultado, etc., pero es mejor que nada. Echaré un vistazo a Deheader, también. Gracias – Reinderien