Domanda

So che la direttiva #warning non è C / C ++ standard, ma diversi compilatori la supportano, incluso gcc / g ++. Ma per coloro che non lo supportano, lo ignoreranno silenziosamente o comporterà un errore di compilazione? In altre parole, posso usarlo in sicurezza nel mio progetto senza interrompere la compilazione per compilatori che non lo supportano?

È stato utile?

Soluzione

È probabile che se un compilatore non supporta #warning, genererà un errore. A differenza di #pragma, non vi è alcuna raccomandazione che il preprocessore ignori le direttive che non comprende.

Detto questo, ho usato compilatori su diverse piattaforme (ragionevolmente comuni) e hanno tutti supportato #warning.

Altri suggerimenti

Va ??notato che MSVC utilizza la sintassi:

#pragma message ( "your warning text here" )

La solita sintassi #warning genera un errore fatale

C1021: invalid preprocessor command 'warning'

quindi non è portatile per quei compilatori.

È probabile che tu riceva almeno un avviso di direttiva non riconosciuto da compilatori che non riconoscono #warning, anche se il blocco di codice non è incluso nella tua compilation. Questo potrebbe o non potrebbe essere trattato come un errore: il compilatore potrebbe legittimamente trattarlo come un errore, ma molti sarebbero più lassisti.

Sei a conoscenza di (puoi nominare) un compilatore diverso da GCC / G ++ che fornisce #warning? [ Modificato: i compilatori Sun Solaris 10 (Sparc) e Studio 11 C / C ++ accettano entrambi #warning.]

Ho avuto questo problema una volta con un compilatore per un processore Atmel. E ha generato errori del preprocessore dovuti al token #warning sconosciuto.

Sfortunatamente la soluzione sembrava essere quella di convertire l'intero albero dei sorgenti per usare l'equivalente #pragma e accettare che il comportamento di compilazione sarebbe stato diverso se si utilizza gcc.

Quando sono passato da Mingw a Visual Studio, ho aggiunto tali righe alla mia intestazione di configurazione globale. (includilo in stdafx.h)

#ifdef __GNUC__
//from https://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html
//Instead of put such pragma in code:
//#pragma GCC diagnostic ignored "-Wformat"
//use:
//PRAGMA_GCC(diagnostic ignored "-Wformat")
#define DO_PRAGMA(x) _Pragma (#x)
#define PRAGMA_GCC(x) DO_PRAGMA(GCC #x)

#define PRAGMA_MESSAGE(x) DO_PRAGMA(message #x)
#define PRAGMA_WARNING(x) DO_PRAGMA(warning #x)
#endif //__GNUC__
#ifdef _MSC_VER
/*
#define PRAGMA_OPTIMIZE_OFF __pragma(optimize("", off))
// These two lines are equivalent
#pragma optimize("", off)
PRAGMA_OPTIMIZE_OFF
*/
#define PRAGMA_GCC(x)
// https://support2.microsoft.com/kb/155196?wa=wsignin1.0
#define __STR2__(x) #x
#define __STR1__(x) __STR2__(x)
#define __PRAGMA_LOC__ __FILE__ "("__STR1__(__LINE__)") "
#define PRAGMA_WARNING(x) __pragma(message(__PRAGMA_LOC__ ": warning: " #x))
#define PRAGMA_MESSAGE(x) __pragma(message(__PRAGMA_LOC__ ": message : " #x))

#endif

//#pragma message "message quoted"
//#pragma message message unquoted

//#warning warning unquoted
//#warning "warning quoted"

PRAGMA_MESSAGE(PRAGMA_MESSAGE unquoted)
PRAGMA_MESSAGE("PRAGMA_MESSAGE quoted")

#warning "#pragma warning quoted"

PRAGMA_WARNING(PRAGMA_WARNING unquoted)
PRAGMA_WARNING("PRAGMA_WARNING quoted")

Ora utilizzo PRAGMA_WARNING (questo problema deve essere corretto)

Sfortunatamente non c'è #pragma warning in gcc, quindi avverte un pragma non specificato.

Dubito che gcc aggiungerà #pragma warning " anziché microsoft aggiungendo #warning .

In realtà la maggior parte dei compilatori che conosco ignorano le direttive #pragma sconosciute e generano un messaggio di avviso, quindi nel caso peggiore, riceverai comunque un avviso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top