Como vejo um arquivo de origem C / C ++ após o pré-processamento no Visual Studio?


206

Digamos que eu tenho um arquivo de origem com muitas diretivas de pré-processador. É possível ver como fica depois do pré-processador?


Ajudaria se você fornecesse mais informações, como qual compilador você está usando.
— JaredPar 10/11/2008

Atualmente, estou usando o Visual Studio 2005 como meu IDE.
— Geo

Por padrão, você está usando o compilador cl.exe.
— Martin Iorque

3
Por que uma resposta do gcc foi aceita quando ele disse que estava usando o VS2005?
— Jim Buck

Respostas:


147

cl.exe, a interface da linha de comandos para o Microsoft Visual C ++, possui três opções diferentes para a saída do arquivo pré-processado (daí a inconsistência nas respostas anteriores sobre o Visual C ++):

Se você deseja pré-processar em um arquivo sem as diretivas #line, combine as opções /Pe /EP.


1
Como passo esses comandos para um projeto com nmake e Makefile?
— WooDzu 9/03

@WooDzu Use NMAKE (nmake.exe) para automatizar tarefas que criam projetos do Visual C ++ usando um makefile tradicional. ~ msdn.microsoft.com/pt-br/library/f35ctcxw.aspx
— G.Rassovsky

8
Observe que /Psuprimirá a geração de arquivos obj. Portanto, se você colocar /Popções, poderá receber um erro no link informando que alguns arquivos obj não podem ser encontrados porque, na verdade, não são gerados.
— smwikipedia

Verifique se você está dentro VS Developer command prompte NÃO Command promptao tentar usar o compilador MS ( cl). O compilador não está disponível no prompt de comando convencional.
— dmytro.poliarush

Comunidade VS2019: O erro / P LNK 1104 ainda está quente na impressora.
— Laurie Stearn 17/01

119

A maioria dos compiladores tem uma opção para executar apenas o pré-processador. por exemplo , o gcc fornece -E:

   -E  Stop after the preprocessing stage; do not run the compiler proper.  
       The output is in the form of preprocessed source code, which is sent
       to the standard output.

Então você pode simplesmente executar:

gcc -E foo.c

Se você não conseguir encontrar essa opção, também poderá encontrar o pré-processador C em sua máquina. Geralmente é chamado de cpp e provavelmente já está no seu caminho. Invoque-o assim:

cpp foo.c

Se houver cabeçalhos que você precise incluir em outros diretórios, você pode passar -I / path / to / include / dir para qualquer um desses diretórios, exatamente como faria com uma compilação regular.

No Windows, deixarei para outros pôsteres para fornecer respostas, pois não sou especialista lá.



100

Clique com o botão direito do mouse no arquivo no Solution Explorer, vá para Propriedades. Em Propriedades de configuração-> C / C ++ -> Pré-processador, "Gerar arquivo pré-processado" é o que você está procurando. Em seguida, clique com o botão direito do mouse no arquivo no Solution Explorer e selecione "Compilar". O arquivo pré-processado é criado no diretório de saída (por exemplo, Release, Debug) com uma extensão .i (obrigado a Steed por seu comentário).


9
"Pré-processamento para um arquivo" no VS2010.
— Rob W

18
BTW, o arquivo é criado no diretório de saída (por exemplo Release, Debug) com uma extensão .i.
— Steed

1
Isso ajuda muito, pois usa a configuração de compilação já configurada no projeto para encontrar todos os cabeçalhos corretos.
— 586 IanHel

Observe que, para mim no MSVC 2015, o arquivo .i não estava no diretório de saída , mas no diretório intermediário do projeto . Estes não são os mesmos se, por exemplo, você gerar seus projetos usando o CMake.
— user1556435

19

Normalmente, você precisa executar um pós-processamento na saída do pré-processador; caso contrário, todas as macros se expandem para um liners, o que é difícil de ler e depurar. Para o código C, algo como o seguinte seria suficiente:

gcc -E code.c | sed '/^\#/d' | indent -st -i2 > code-x.c

Para código C ++, é realmente muito mais difícil. Para o GCC / g ++, achei este script Perl útil.


8

Não sei nada sobre o compilador da Microsoft, mas no GCC você pode usar isso:

gcc -E -P -o result.c my_file.h

Se você quiser ver comentários, use isto:

gcc -E -C -P -o result.c my_file.h

Mais opções disponíveis nesta página .


1
Isso também funciona com compiladores derivados do gcc, como qcc.exe - obrigado!
— sage

8

Tente cl /EPse você estiver usando o compilador C ++ da Microsoft.



5

Como bk1e e Andreas M. responderam, a opção / P para o compilador fará com que ele pré-processe um arquivo. No entanto, no meu projeto usando o VS2005 e o Platform Builder (para um processador ARM incorporado), o projeto não apresentou uma opção na caixa de diálogo (conforme descrito por Jim B) para habilitá-la.

Eu poderia executar o CL manualmente e adicionar / P, mas falhou porque não conhecia todas as opções de linha de comando apropriadas que estavam invisivelmente sendo ativadas pelo Platform Builder durante a compilação completa. Então, eu precisava conhecer todas essas opções.

Minha solução foi procurar no arquivo build.log e encontrar a linha que executou

CL blah-blah-blah myfile.c

Copiei esta linha para a área de transferência. A parte "blá-blá-blá" continha as opções de compilação e era enorme.

De volta ao IDE, cliquei com o botão direito do mouse em myfile.c, escolhi "Abrir janela de compilação" e, nessa janela, colei a linha de comando da compilação e adicionei um "/ P".

CL /P blah-blah-blah myfile.c

Feito. O arquivo myfile.i foi produzido, que continha a saída do pré-processador.


2

CPIP é um novo pré-processador C / C ++ escrito em Python. Se você quiser uma representação visual detalhada de um arquivo pré-processado, faça uma tentativa.

CPIP é um pré-processador C / C ++ implementado em Python. A maioria dos pré-processadores considera o pré-processamento como um trabalho sujo, que precisa ser feito o mais rápido possível. Isso pode dificultar a detecção de defeitos sutis no estágio de pré-processamento, pois os pré-processadores jogam fora muitas informações úteis para obter o resultado o mais barato possível.

Poucos desenvolvedores realmente entendem o pré-processamento, para muitos é um pouco obscuro de magia negra. O CPIP tem como objetivo melhorar isso e registrando todos os detalhes do pré-processamento para que o CPIP possa produzir algumas informações maravilhosamente visuais sobre dependências de arquivos, uso de macro e assim por diante.

O CPIP não foi projetado para substituir o cpp (ou qualquer outro pré-processador estabelecido); em vez disso, o CPIP considera a clareza e o entendimento como mais importantes que a velocidade do processamento.


2

No sistema operacional Windows, uma resposta simples de uma linha para esta pergunta é usar o comando abaixo no prompt do DOS para ver o arquivo pré-processado:

CL /P /C myprogram.c

Isso irá gerar um arquivo chamado myprogram.i . Abra-o e procure seus pré-processadores expandidos.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.