Vorrei essere in grado di fare qualcosa di simileEsiste un modo portatile per stampare un messaggio dal preprocessore C?
#print "C Preprocessor got here!"
a scopo di debug. Qual è il modo migliore/più portabile per farlo?
Vorrei essere in grado di fare qualcosa di simileEsiste un modo portatile per stampare un messaggio dal preprocessore C?
#print "C Preprocessor got here!"
a scopo di debug. Qual è il modo migliore/più portabile per farlo?
La direttiva warning
è probabilmente il più vicino si arriva, ma non è del tutto indipendente dalla piattaforma:
#warning "C Preprocessor got here!"
per quanto ne so questo funziona sulla maggior parte dei compilatori, ad eccezione MSVC, su cui dovrete usare un pragma
direttiva:
#pragma message ("C Preprocessor got here!")
Non è possibile. I preprocessori vengono elaborati prima del codice C. Non ci sono direttive 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 non va in:
#ifdef ...
printf("Hello");
#endif
Perché questo è tutto ciò che si può fare per quanto preprocessori andare.
Questo non verrà stampato in fase di compilazione, che è quello che sto pensando OP sta cercando. –
Supponevo che intendesse la stampa in fase di esecuzione. –
Stavo chiedendo informazioni sulla compilazione. Grazie! –
Si potrebbe desiderare di provare: #pragma message("Hello World!")
I seguenti sono supportati da MSVC e GCC.
#pragma message("stuff")
#pragma message "stuff"
Clang ha iniziato l'aggiunta del supporto di recente, vedere here di più.
Solo per la cronaca, Solaris Studio 12.3 (Sun C 5.12) non supporta questo pragma. – maxschlepzig
La maggior parte dei compilatori C riconosceranno una direttiva #warning
, così
#warning "Got here"
C'è anche il '#error' direttiva di serie,
#error "Got here"
Mentre tutti i compilatori supportano che, sarà anche fermare il compilazione/pre-elaborazione.
#pragma message("foo")
funziona benissimo. Inoltre non arresterebbe la compilazione anche se si utilizza -Werror
Un'altra soluzione è utilizzare i commenti più uno script di shell per elaborarli. Questo richiede un po 'di disciplina (o uno script di shell che cattura errori di battitura).
Ad esempio, aggiungo commenti formattati //TODO
e quindi uno script di shell che li raccoglie tutti in un report.
Per casi d'uso più complessi, è possibile provare a scrivere il proprio semplice preprocessore. Ad esempio, è possibile modificare le origini come file *.c2
. Il semplice preprocessore dovrebbe leggere la fonte, cercare //TODO
e scrivere printf("TODO ...")
nel file di output *.c
.
Che pone la domanda, puoi mettere una direttiva basata su un flag di compilazione per scambiare "pragma message" e "warning" in qualche modo? Ad esempio, qualcosa come: '#ifdef _LINUX #define #preprocmsg" #warning "else #define #preprocmsg" #pragma message "' ... Dovrò provarlo ma l'istinto mi dice che la risposta è no. – Bryan
@Bryan: Sì. '#define WARNING (msg) _Pragma (" message "#msg)' –
#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à grandioso, poiché gli avvertimenti vengono trattati come errori per noi in generale, e ci piacerebbe che il messaggio fosse informativo, piuttosto che fermare il compilazione. –