In un'intestazione che dovrebbe essere in grado di compilare in file C e C++, in Visual Studio (2010) e MinGW (32-bit - v3.4.5, 64-bit - v4.5.0) sto cercando di minimizzare le dimensioni modificando ognuno di tale linea (ci sono molti di loro):mettendo #warning all'interno del corpo di # define
// for symbol A
#ifdef __GNUC__
# warning Symbol A is deprecated. Use predefined const cnA instead.
#else
# pragma message("Symbol A is deprecated. Use predefined const cnA instead.")
#endif
// Same for B
// Same for C
// . . .
a
// define this once:
#ifdef __GNUC__
# define X_Warning(x) #warning "Symbol " x " is deprecated. Use cn" x // (1)
#else
# define X_Warning(x) __pragma(message("Symbol " x " is deprecated. Use cn" x "))
#endif
// and use like this:
X_Warning("A")
X_Warning("B")
X_Warning("C")
o, almeno a questo:
// define this once:
#ifdef __GNUC__
# define Y_Warning(x) #warning x // (2)
#else
# define Y_Warning(x) __pragma(message(x))
#endif
// and use like this:
Y_Warning("Symbol A is deprecated. Use predefined const cnA instead.")
Y_Warning("Symbol B is deprecated. Use predefined const cnB instead.")
Y_Warning("Symbol C is deprecated. Use predefined const cnC instead.")
. . .
Ma la linea contrassegnata con (1) non funziona.
__pragma
è l'equivalente di Microsoft per #pragma
da utilizzare in questo tipo di situazioni.
- Qual è il modo giusto per farlo?
- E 'possibile anche per MinGW/gcc?
- è
__GNU__
simbolo giusto da utilizzare per tali cose?
P.S. Ho dimenticato di menzionare che A, B, C .. sono simboli # definiti. In quel caso non è possibile fare con il mio vecchio MinGW v3.4.5 (almeno nel mio caso con questa particolare configurazione). E la risposta di @ Edwin è corretta.
Ma _Pragma è supportato da versioni più recenti di MingW e, grazie alla @Christoph una risposta, è possibile procedere come segue:
// define this once:
#ifdef __GNUC__
# define DO_PRAGMA(x) _Pragma (#x)
# define X_Warning(x) DO_PRAGMA(message "Symbol " #x " is deprecated. Use cn" x)
#else
# define X_Warning(x) __pragma(message("Symbol " x " is depricated. Use cn" x))
#endif
// and use like this:
#ifdef A
X_Warning("A")
#endif
#ifdef C
X_Warning("B")
#endif
#ifdef B
X_Warning("C")
#endif
Marcatura come deprecato sembra funzionare in alcuni casi, ma non per me. Richiede di definire i simboli deprecati prima del loro utilizzo che non è il mio caso e al di fuori del mio controllo.
depricated -> deprecato –
non puoi farlo: non è possibile avere una direttiva del preprocessore come il risultato di macro espansione – Anycorn
non Vuol MSVS sostenere la direttiva #WARNING, troppo? –