Mostrar la jerarquía #include para un archivo C ++ en Visual Studio

169

Problema: Tengo un gran proyecto de Visual C ++ que estoy intentando migrar a Visual Studio 2010. Es una gran mezcla de cosas de varias fuentes y de diferentes edades. Tengo problemas porque algo incluye ambos winsock.hy winsock2.h.

Pregunta: ¿Qué herramientas y técnicas existen para mostrar la #includejerarquía de un archivo fuente de Visual Studio C ++?

Sé sobre cl /Pcómo obtener la salida del preprocesador, pero eso no muestra claramente qué archivo incluye qué otros archivos (y en este caso, la /Psalida tiene 376,932 líneas de largo 8-)

En un mundo perfecto, me gustaría una visualización jerárquica de qué archivos incluyen qué otros archivos, junto con números de línea para poder saltar a las fuentes:

source.cpp(1)
  windows.h(100)
    winsock.h
  some_other_thing.h(1234)
    winsock2.h
RichieHindle
fuente
2
Para las personas que buscan una solución GCC / Clang, utilícelas gcc -H -fsyntax-only ...para generar la jerarquía. Créditos para stackoverflow.com/a/18593344/427545
Lekensteyn

Respuestas:

234

Hay una configuración:

Configuración del proyecto -> Propiedades de configuración -> C / C ++ -> Avanzado -> Mostrar incluye

eso generará el árbol. Se asigna al compilador switch / showIncludes

xtofl
fuente
20
Nota: la jerarquía se puede ver en la ventana Salida.
CannibalSmith
3
Si alguien está interesado: incluso si selecciona el estruendo conjunto de herramientas de la plataforma , todavía se puede "mostrar incluye" si se agrega -HenC/C++ -> Command Line - Additional Options
WIP
3
Todavía no es tan bueno como la función "incluido desde" de gcc, que muestra la jerarquía de inclusión directa relacionada con un error en tiempo de compilación, y que también muestra números de línea.
Paul
2
Hice una expresión regular rápida que elimina el Visual Studio incluye (cualquier cosa en Archivos de programa (x86)). Puede copiar + pegar su ventana de salida en una aplicación como Notepad ++ y hacer una expresión regular buscar y reemplazar con espacio en blanco para quitar todos los VS incluidos de su árbol:1>\s*Note: including file:\s*C:\\Program Files \(x86\).*(\r\n|\n|$)
kjhf
2
Tenga en cuenta que si bien / showIncludes se puede alternar para un archivo de origen individual, no tendrá ningún efecto a menos que / showIncludes esté configurado en el nivel del proyecto.
David Carr
20

El compilador también es compatible con un modificador / showIncludes: no proporciona números de línea, pero puede ofrecer una visión bastante completa de qué incluye venir de dónde.

Está en Configuración del proyecto -> Propiedades de configuración -> C / C ++ -> Avanzado -> Mostrar incluye.

Kim Gräsman
fuente
+1 Muchas gracias! (Pero me temo que xtofl obtiene la aceptación por ser más rápido).
RichieHindle
17

Hemos encontrado que IncludeManager es una herramienta muy poderosa. No es gratuito (pero no es costoso) y nos permitió controlar nuestros problemas de inclusión y reducir nuestro tiempo de compilación de 50 minutos a 8 minutos al eliminar grandes porciones de inclusiones que no estábamos usando.

Colin Desmond
fuente
55
Yow! Ejecuté IncludeManager en el archivo ofensivo, y produjo un gráfico que me hizo reír a carcajadas. Según mis cálculos, necesitaría un monitor de 400 "para ver todo. Creo que estamos más allá de su poder para ayudar. 8-)
RichieHindle
2
Actualización: la empresa matriz de IncludeManager, ProFactor (www.profactor.co.uk) ha dejado de funcionar, pero proporciona sus versiones más recientes de forma gratuita desde el sitio web anterior. La desventaja es que solo funciona en versiones completas de Visual Studio desde VS2005 a VS2013.
Dana
5

No es tan bueno como la función de inclusión jerárquica de gcc, que muestra la jerarquía de inclusión de línea directa en caso de error. La opción "mostrar incluye" en VS muestra todo, lo cual es excesivo al depurar problemas de archivos jerárquicos incluidos.

Pablo
fuente
Espero esto desde hace 5 años, que usé con mingw.
fantastory
2
¿Quizás agregar algunos detalles sobre cómo usarlo, dónde está la documentación, etc.? Esta respuesta no agrega mucho actualmente.
Sam Brightman
4

Aquí hay una buena herramienta FOSS de terceros. Puede exportar resultados a XML, que incluirá datos sobre la cantidad de ocurrencias y números de línea.

Daniel F. Thornton
fuente
4

Ahora hay un complemento para Visual Studio llamado IncludeToolbox . Puede enumerar sus inclusiones dependientes y hacer más cosas como eliminar y compilar al azar para ver si esa inclusión fue necesaria.

Fantástico señor Fox
fuente
2

cl / P debería mostrarle los números de línea, de modo que pueda decir el contexto de dónde se incluye un archivo de encabezado.

Si saca las líneas con ...

grep "^ # line" file.i

... entonces debería tener una indicación bastante clara de qué archivos se encontraron en orden por el preprocesador.

Si es un incidente único, este debería ser un diagnóstico bastante rápido.

polígloto
fuente
2
Claro, pero eso me da ocho mil líneas de salida no estructurada, sin jerarquía.
RichieHindle
Había estado mirando a través de la salida cl / P durante bastante tiempo, y me preguntaba si había una mejor herramienta para el trabajo. Ahora he descubierto que sí, lo cual es genial. La pregunta es general, y las respuestas estarán aquí en SO para siempre, para que otros las encuentren.
RichieHindle
0

Yo uso Doxygen y GraphViz .

ingrese la descripción de la imagen aquí

Instalar ambos. Asegúrese de seleccionar GraphViz como la herramienta para generar los diagramas de jerarquía. Seleccione "Usar herramienta de puntos del paquete GraphVix".

También asegúrese de incluir el directorio binario de GraphViz en su variable de entorno PATH.

Santiago Villafuerte
fuente