2010-05-08 9 views
13

Sto supponendo da # che si tratta solo di un'utilità di compilazione. Come può essere usato nei programmi C/C++?Come funziona #error in C/C++?

Non ho trovato molto su Internet. Qualsiasi link sarebbe utile.

risposta

12

Fa sì che il compilatore (o il preprocessore) emetta il messaggio di errore. In C++, rende anche l'unità di traduzione malformata (cioè, causa la mancata compilazione).

Se si dispone di diverse macro che potrebbero essere definiti e si vuole essere sicuri che solo certe combinazioni di essi sono definiti, è possibile utilizzare #error per causare la compilazione di fallire se una combinazione non valida è definito.

Può anche essere utile se si vuole essere sicuri che qualche blocco di codice non venga mai compilato (per qualsiasi motivo).

+1

cosa intendete per "solo determinate combinazioni di macro sono definite". Puoi citare un esempio? Grazie. – Moeb

+0

@cambr: ad esempio, se hai due macro, 'DO_X' e' DO_Y' e vuoi assicurarne solo una alla volta, puoi racchiudere una direttiva '# error' in un' #if (definito DO_X) && (definito DO_Y) 'blocco. –

+5

@cambr: supponiamo che la tua azienda venda Slicer ™ e Dicer ™. Entrambi i prodotti usano 'blade.c', ma passano diverse macro attraverso il sistema di build per funzionalità leggermente diverse. Quindi si può usare '#if SLICING ... #elif DICING ... #else #error Nessuna funzionalità selezionata da makefile. – Potatoswatter

2

Questo è il link alla documentazione del preprocessore Gnu spiegando le direttive #error e #warning: http://gcc.gnu.org/onlinedocs/cpp/Diagnostics.html

In particolare:

La direttiva #error fa sì che il preprocessore per segnalare un errore fatale. I token che formano il resto della riga vengono utilizzati come il messaggio di errore.

Vedere anche this question sulla portabilità di queste direttive.

+4

La direttiva' # error' fa parte degli standard di linguaggio C e C++ ed è completamente portatile. '# warning' è un'estensione di linguaggio specifica per gcc. –

+0

@james, grazie per il chiarimento. – UncleZeiv

9

Utile per controllare le impostazioni del compilatore e verificare le combinazioni di valori macro. Alcuni esempi casuali:

#if !defined(_DLL) 
# error This code will only work properly when compiled with /MD 
#endif 

#if _WIN32_WINNT < 0x502 
# error Sorry, Windows versions prior to XP SP2 are not supported 
#endif 

#if defined(_APPLE) && defined(_LINUX) 
# error Conflicting operating system option selected, choose one. 
#endif 
+0

Sei davvero in grado di gestire l'ultimo in pratica? Non è responsabilità dell'utente non essere braindead e non usare flag di compilazione senza senso? Non è possibile controllare * tutto * ... – Thomas

+3

È solo un esempio. Tendi ad aggiungere questa roba quando ne hai troppe. Ad esempio, Boost ne è pieno. –