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?

Geo
fonte
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
Relacionado: Informações do compilador .
Laurie Stearn

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.

bk1e
fonte
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á.

Todd Gamblin
fonte
2
pergunta do gcc: stackoverflow.com/questions/3916979/…
Ciro Santilli </ h>
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).

Jim Buck
fonte
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.

ididak
fonte
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 .

dzav
fonte
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.

Atempcode
fonte
6

No Visual Studio, você pode compilar um arquivo (ou projeto) com / P.

Andreas Magnusson
fonte
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.

Sam Pittman
fonte
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.

thegreendroid
fonte
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.

manty
fonte