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

169

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

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

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

Em um mundo perfeito, eu gostaria de uma exibição hierárquica de quais arquivos incluem quais outros, junto com os números das linhas, para que eu possa pular para as fontes:

source.cpp(1)
  windows.h(100)
    winsock.h
  some_other_thing.h(1234)
    winsock2.h
RichieHindle
fonte
2
Para pessoas que procuram uma solução GCC / Clang, use gcc -H -fsyntax-only ...para gerar a hierarquia. Créditos para stackoverflow.com/a/18593344/427545
Lekensteyn

Respostas:

234

Há uma configuração:

Configurações do projeto -> Propriedades de configuração -> C / C ++ -> Avançado -> Mostrar inclusões

isso irá gerar a árvore. Ele mapeia para o compilador switch / showIncludes

xtofl
fonte
20
Nota: a hierarquia pode ser vista na janela Saída.
CannibalSmith
3
Se de qualquer pessoa interessada: mesmo se você selecionar o Clang plataforma conjunto de ferramentas , você pode ainda "show inclui" se você adicionar -HemC/C++ -> Command Line - Additional Options
wip
3
Ainda não é tão bom quanto o recurso "incluído de" do gcc, que mostra a hierarquia direta de inclusão relacionada a um erro em tempo de compilação e que também exibe os números das linhas.
Paul
2
Fiz uma rápida regex que retira o Visual Studio inclui (qualquer coisa em Arquivos de Programas (x86)). Você pode copiar + colar sua janela de saída para um aplicativo como o Notepad ++ e fazer um achado regex e substituir com espaço em branco para retirar todos VS inclui desde sua árvore:1>\s*Note: including file:\s*C:\\Program Files \(x86\).*(\r\n|\n|$)
kjhf
2
Observe que, embora / showIncludes possa ser alternado para um arquivo de origem individual, ele não terá efeito, a menos que / showIncludes seja definido no nível do projeto.
David Carr
20

O compilador também suporta uma opção / showIncludes - não fornece números de linha, mas pode fornecer uma visão bastante abrangente de quais são as informações de onde vem.

Está em Configurações do projeto -> Propriedades de configuração -> C / C ++ -> Avançado -> Mostrar inclusões.

Kim Gräsman
fonte
+1 Muito obrigado! (Mas receio que o xtofl obtenha o Accept por ser mais rápido).
21416 RichieHindle
17

Nós descobrimos que o IncludeManager é uma ferramenta muito poderosa. Não é gratuito (mas não é caro) e nos permitiu controlar nossos problemas de inclusão e reduzir o tempo de compilação de 50 minutos para 8 minutos, removendo grandes pedaços de inclusões que não estávamos usando.

Colin Desmond
fonte
5
Yow! Corri o IncludeManager no arquivo ofensivo e produziu um gráfico que me fez rir alto. Pelos meus cálculos eu precisaria de um monitor de 400" para ver a coisa toda eu acho que estamos além do seu poder para ajudar 8-)..
RichieHindle
2
Atualização - a empresa-mãe do IncludeManager, ProFactor (www.profactor.co.uk), encerrou suas atividades, mas está fornecendo seus lançamentos mais recentes gratuitamente, no site acima. O lado negativo é que ele só funciona em versões completas do Visual Studio do VS2005 ao VS2013.
Dana
5

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, que é um exagero ao depurar problemas de arquivos de inclusão hierárquicos.

Paulo
fonte
Eu espero por isso já há 5 anos, que usei com o mingw.
fantastory
2
Talvez adicione alguns detalhes de como usá-lo, onde está a documentação etc.? Esta resposta não adiciona muito atualmente.
Sam Brightman
4

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

Daniel F. Thornton
fonte
4

Agora existe um plug-in para o Visual Studio chamado IncludeToolbox . Ele pode listar suas inclusões dependentes e fazer mais coisas como uma remoção e compilação aleatória para verificar se essa inclusão foi necessária.

Fantastic Mr Fox
fonte
2

cl / P deve mostrar os números de linha, para que você possa informar o contexto de onde um arquivo de cabeçalho está sendo incluído.

Se você cumprimentar as linhas com ...

grep "^ # line" file.i

... então você deve ter uma indicação bastante clara de quais arquivos foram encontrados em ordem pelo pré-processador.

Se for um incidente pontual, esse deve ser um diagnóstico bastante rápido.

poliglota
fonte
2
Claro, mas isso me dá oito mil linhas de saída não estruturada, sem hierarquia.
21415 RichieHindle
Eu estava analisando a saída cl / P há bastante tempo e me perguntava se havia uma ferramenta melhor para o trabalho. Agora eu descobri que existe, o que é ótimo. A pergunta é geral, e as respostas estarão aqui para sempre para que outras pessoas possam encontrar.
21715 RichieHindle
0

Eu uso Doxygen e GraphViz .

insira a descrição da imagem aqui

Instale ambos. Certifique-se de selecionar GraphViz como a ferramenta para gerar os diagramas de hierarquia. Selecione "Usar ferramenta de pontos no pacote GraphVix".

Certifique-se também de incluir o diretório binário do GraphViz na sua variável de ambiente PATH.

Santiago Villafuerte
fonte