Exibindo a hierarquia #include para um arquivo C ++ no Visual Studio

Problema: Eu tenho um grande projeto Visual C ++ que estou tentando migrar para o Visual Studio 2010. É uma mistura enorme de material de várias origens e de várias idades. Estou tendo problemas porque algo está incluindo o winsock.h winsock2.h .

Pergunta: Quais ferramentas e técnicas existem para exibir a hierarquia #include para um arquivo de origem do Visual Studio C ++?

Eu sei sobre cl /P para obter a saída do pré-processador, mas isso não mostra claramente qual arquivo inclui quais outros arquivos (e, neste caso, a saída /P é 376.932 linhas de comprimento 😎

Em um mundo perfeito, eu gostaria de uma exibição hierárquica de quais arquivos incluem quais outros arquivos, junto com números de linha, para que eu possa acessar as fonts:

 source.cpp(1) windows.h(100) winsock.h some_other_thing.h(1234) winsock2.h 

Existe uma configuração:

Configurações do Projeto -> Propriedades de Configuração -> C / C ++ -> Avançado -> Mostrar Inclui

isso gerará a tree. Ele mapeia para o switch / showIncludes do compilador

O compilador também suporta um switch / showIncludes – ele não fornece números de linha, mas pode fornecer uma visão abrangente de quais includes vêm de onde.

Está sob Configurações do Projeto -> Propriedades de Configuração -> C / C ++ -> Avançado -> Mostrar Inclui.

Nós descobrimos que o IncludeManager é uma ferramenta muito poderosa. Ele não é gratuito (mas não é caro) e nos permitiu controlar nossos problemas de inclusão e reduzir nosso tempo de compilation de 50 minutos para 8 minutos removendo grandes blocos de inclusão que não estávamos usando.

Não tão bom quanto o recurso de inclusão hierárquica do gcc, que mostra a hierarquia de inclusão de linha direta no caso de um erro. A opção “show includes” no VS mostra tudo, o que é um exagero ao depurar problemas de arquivos de inclusão hierárquicos.

Aqui está uma boa ferramenta FOSS de terceiros. Você pode exportar resultados para XML, que includeá dados sobre o número de ocorrências e números de linha.

Tente redhat Source-Navigator para uma solução mais gráfica .

cl / P deve mostrar os números de linha, de tal forma que você pode dizer o contexto de onde um arquivo de header está sendo incluído.

Se você grep as linhas com …

grep “^ # line” file.i

… então você deve ter uma indicação clara de quais arquivos foram encontrados na ordem do pré-processador.

Se é um incidente único, este deve ser um diagnóstico bastante rápido.

Existe agora um plugin para o Visual Studio chamado IncludeToolbox . Pode listar seu dependente inclui e fazer mais coisas como uma remoção aleatória e compilar para ver se essa inclusão foi necessária.