2012-02-22 5 views
8

Ho un file C che richiede uno specifico file di intestazione. Se il file di intestazione non esiste, voglio che il preprocessore emetta un avvertimento specifico. Qualcosa di simile:Il preprocessore C può rilevare se non è possibile trovare un file di intestazione ed emettere un avviso specifico?

#if !(#include <special.h>) 
#warning "Don't worry, you can fix this." 
#warning "You just need to update this other repo over here:" 
#endif 

Questo è possibile con la C preprocessore ?

+0

E 'possibile in un file makefile. –

+2

di solito lo fai con uno script './Configure' –

+0

possibile duplicato di [Si può usare il preprocessore C per sapere se esiste un file?] (Http://stackoverflow.com/questions/142877/can-the-c -preprocessore-essere-usato-per-dire-se-un-file-esiste) –

risposta

9

Si può sempre verificare se la macro #define X, dal file incluso, è ... :) definito

+1

E come aiuta? – asaelr

+0

@asaelr Non sono sicuro se questo è vero per tutti, ma nel mio setup di build il PP/CC continuerà a premere coraggiosamente se non riesce a trovare un file include. Così '#include ' seguito da '#ifndef __SPECIAL_H__' funziona per me –

7

No, questo non è possibile. Tutto quello che puoi fare è provare a #include l'intestazione, e se non esiste, il compilatore ti darà un errore.

Un'alternativa sarebbe quella di utilizzare uno strumento come GNU autoconf. autoconf genera uno script di shell chiamato configure che analizza il tuo sistema di build e determina le cose come se hai o meno determinati file di header installati, e genera un file di intestazione composto da macro che indicano tali informazioni.

Per esempio, si potrebbe definire HAVE_SYS_TIME_H se il sistema di compilazione include l'intestazione <sys/time.h>, in modo da poter poi scrivere codice come:

#if HAVE_SYS_TIME_H 
#include <sys/time.h> 
#else 
#warning "Don't worry, you can fix this." 
#endif 
+1

YEPP, ma ha più senso di emettere l'avviso/errore dal script di configurazione ... –

-3

Se tutto ciò che serve è un avviso che il file di intestazione non è lì (e nessun codice personalizzato), quindi la maggior parte dei compilatori ne darà già uno.

$ LC_MESSAGES=en_US gcc -c bar.c 
bar.c:1:17: fatal error: foo.h: No such file or directory 
compilation terminated. 
+6

Quindi, un errore fatale e un avvertimento sono praticamente la stessa cosa per te, non sono loro? –

12

So che questa è una domanda vecchia, ma ho anche bisogno di un modo per fare questo e sono rimasto deluso quando ho letto queste risposte. Si scopre che clang ha una bella direttiva __has_include("header name") che funziona perfettamente per fare quello che ti serve :) Forse si vuole verificare se la direttiva è disponibile prima chiamando #if defined(__has_include)

+5

[gcc ha anche questo] (https://gcc.gnu.org/gcc-5/changes.html). Dice gcc 5, ma 4.9 sembra funzionare bene per me. –

Problemi correlati