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.
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.
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).
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.
La direttiva' # error' fa parte degli standard di linguaggio C e C++ ed è completamente portatile. '# warning' è un'estensione di linguaggio specifica per gcc. –
@james, grazie per il chiarimento. – UncleZeiv
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
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
È solo un esempio. Tendi ad aggiungere questa roba quando ne hai troppe. Ad esempio, Boost ne è pieno. –
cosa intendete per "solo determinate combinazioni di macro sono definite". Puoi citare un esempio? Grazie. – Moeb
@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. –
@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