Existe uma maneira portátil de imprimir uma mensagem do pré-processador C?


99

Eu gostaria de ser capaz de fazer algo como

#print "C Preprocessor got here!"

para fins de depuração. Qual é a melhor / mais portátil maneira de fazer isso?

Respostas:


114

A warningdiretiva é provavelmente o mais próximo que você chegará, mas não é totalmente independente da plataforma:

#warning "C Preprocessor got here!"

AFAIK funciona na maioria dos compiladores, exceto MSVC, no qual você terá que usar uma pragmadiretiva:

#pragma message ( "C Preprocessor got here!" )

5
O que levanta a questão, você pode colocar uma diretiva baseada em um sinalizador de compilação para trocar "mensagem pragma" e "aviso" de alguma forma? Por exemplo, algo como: #ifdef _LINUX #define #preprocmsg "#warning" else #define #preprocmsg "#pragma message"... Vou tentar fazer isso, mas o instinto me diz que a resposta é não.
Bryan

11
@Bryan: Sim. #define WARNING(msg) _Pragma("message " #msg)
Matt Joiner,

1
#pragma message () não é suportado por versões mais antigas do gcc (como gcc 4.1.2, a versão padrão no RHEL5). Ainda estou para encontrar um equivalente apropriado para essas versões mais antigas - #warning não vai ser ótimo, já que os avisos são tratados como erros para nós em geral, e realmente gostaríamos que a mensagem fosse informativa, em vez de interromper a compilação.
Danny S

6
Emitir um aviso é muito inconveniente quando seu projeto é compilado com -Wall por padrão. #pragma message não tem esse problema.
Renan Gemignani

56

Os itens a seguir são compatíveis com MSVC e GCC .

#pragma message("stuff")
#pragma message "stuff"

O Clang começou a adicionar suporte recentemente, veja aqui para mais informações.


3
Apenas para registro, Solaris Studio 12.3 (Sun C 5.12) não oferece suporte a esse pragma.
maxschlepzig

Funciona com Arduino 1.8 usando Visual Studio vMicro. Obrigado!
save_jeff

12

Você pode querer tentar: #pragma message("Hello World!")


9

A maioria dos compiladores C reconhecerá uma #warningdiretiva, então

 #warning "Got here"

Há também a diretiva padrão '#error',

 #error "Got here"

Embora todos os compiladores suportem isso, ele também interromperá a compilação / pré-processamento.


6
#pragma message("foo")

funciona bem. Também não para a compilação, mesmo se você usar -Werror


0

Outra solução é usar comentários mais um script de shell para processá-los. Isso requer alguma disciplina (ou um script de shell que detecta erros de digitação).

Por exemplo, adiciono comentários formatados //TODOe, em seguida, um script de shell que coleta todos eles em um relatório.

Para casos de uso mais complexos, você pode tentar escrever seu próprio pré-processador simples. Por exemplo, você pode editar suas fontes como *.c2arquivos. O pré-processador simples iria ler a fonte, procurar //TODOe escrever printf("TODO ...")no *.carquivo de saída .


-17

Você não pode. Os pré-processadores são processados ​​antes do código C. Não há diretivas de pré-processador para imprimir na tela, porque o código do pré-processador não é executado, ele é usado para gerar o código C que será compilado em código executável.

Qualquer coisa errada com:

#ifdef ...
printf("Hello");
#endif

Porque isso é tudo que você pode fazer no que diz respeito aos pré-processadores.


5
Isso não será impresso em tempo de compilação, que é o que estou pensando que o OP está procurando.
Bob Kaufman

Presumi que ele quis dizer imprimir em tempo de execução.
Alexander Rafferty

1
Eu estava perguntando sobre o tempo de compilação. Obrigado!
Andrew Wagner,
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.