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?

Andrew Wagner
fonte

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!" )
Vocês
fonte
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.

Matt Joiner
fonte
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!")

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

nos
fonte
6
#pragma message("foo")

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

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

Aaron Digulla
fonte
-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.

Alexander Rafferty
fonte
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,