Digamos que eu tenho um arquivo de origem com muitas diretivas de pré-processador. É possível ver como fica depois do pré-processador?
Digamos que eu tenho um arquivo de origem com muitas diretivas de pré-processador. É possível ver como fica depois do pré-processador?
Respostas:
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 ++):
/E
: pré-processo para stdout (semelhante à opção -E do GCC)/P
: pré-processo para arquivar/EP
: pré-processo para stdout sem diretivas #lineSe você deseja pré-processar em um arquivo sem as diretivas #line, combine as opções /P
e /EP
.
/P
suprimirá a geração de arquivos obj. Portanto, se você colocar /P
opçõ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.
VS Developer command prompt
e NÃO Command prompt
ao tentar usar o compilador MS ( cl
). O compilador não está disponível no prompt de comando convencional.
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á.
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).
Release
, Debug
) com uma extensão .i
.
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.
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 .
No Visual Studio, você pode compilar um arquivo (ou projeto) com / P.
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.
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.