Esiste un modo portatile per stampare un messaggio dal preprocessore C?


99

Mi piacerebbe poter fare qualcosa di simile

#print "C Preprocessor got here!"

per scopi di debug. Qual è il modo migliore / più portatile per farlo?

Risposte:


114

La warningdirettiva è probabilmente la più vicina che otterrai, ma non è del tutto indipendente dalla piattaforma:

#warning "C Preprocessor got here!"

Per quanto ne so, funziona sulla maggior parte dei compilatori tranne MSVC, su cui dovrai usare una pragmadirettiva:

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

5
Il che solleva la domanda, puoi mettere una direttiva basata su un flag di compilazione per scambiare in qualche modo "messaggio pragma" e "avviso"? Ad esempio, qualcosa del tipo: #ifdef _LINUX #define #preprocmsg "#warning" else #define #preprocmsg "#pragma message"... dovrò provare ma l'istinto mi dice che la risposta è no.
Bryan

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

1
#pragma message () non è supportato dalle versioni precedenti di gcc (come gcc 4.1.2, la versione predefinita su RHEL5). Devo ancora trovare un equivalente appropriato per queste versioni precedenti - #warning non sarà eccezionale, poiché gli avvisi sono trattati come errori per noi in generale, e vorremmo davvero che il messaggio fosse informativo, piuttosto che interrompere la compilazione.
Danny S

6
Emettere un avviso è molto scomodo quando il progetto viene compilato con -Wall per impostazione predefinita. Il messaggio #pragma non ha questo problema.
Renan Gemignani

56

I seguenti sono supportati da MSVC e GCC .

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

Clang ha iniziato ad aggiungere il supporto di recente, vedi qui per ulteriori informazioni.


3
Solo per la cronaca, Solaris Studio 12.3 (Sun C 5.12) non supporta questo pragma.
maxschlepzig

Funziona con Arduino 1.8 utilizzando Visual Studio vMicro. Grazie!
save_jeff

12

Potresti provare: #pragma message("Hello World!")


9

La maggior parte dei compilatori C riconoscerà una #warningdirettiva, quindi

 #warning "Got here"

C'è anche la direttiva standard "#error",

 #error "Got here"

Sebbene tutti i compilatori lo supportino, interromperà anche la compilazione / pre-elaborazione.


6
#pragma message("foo")

funziona alla grande. Inoltre, non interromperai la compilazione anche se usi -Werror


0

Un'altra soluzione è usare i commenti più uno script di shell per elaborarli. Questo richiede un po 'di disciplina (o uno script di shell che cattura gli errori di battitura).

Ad esempio, aggiungo commenti formattati //TODOe quindi uno script di shell che li raccoglie tutti in un report.

Per casi d'uso più complessi, puoi provare a scrivere il tuo semplice preprocessore. Ad esempio, potresti modificare le tue fonti come *.c2file. Il semplice preprocessore legge il sorgente, cerca //TODOe scrive printf("TODO ...")nel *.cfile di output .


-17

Non puoi. I preprocessori vengono elaborati prima del codice C. Non ci sono direttive del preprocessore da stampare sullo schermo, poiché il codice del preprocessore non viene eseguito, viene utilizzato per generare il codice C che verrà compilato in codice eseguibile.

Qualcosa di sbagliato in:

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

Perché questo è tutto ciò che puoi fare per quanto riguarda i preprocessori.


5
Questo non verrà stampato in fase di compilazione, che è quello che penso che OP stia cercando.
Bob Kaufman

Ho pensato che intendesse stampare in fase di esecuzione.
Alexander Rafferty

1
Stavo chiedendo del tempo di compilazione. Grazie!
Andrew Wagner
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.