2011-01-21 2 views
6

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.

  1. Qual è il modo giusto per farlo?
  2. E 'possibile anche per MinGW/gcc?
  3. è __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.

+0

depricated -> deprecato –

+3

non puoi farlo: non è possibile avere una direttiva del preprocessore come il risultato di macro espansione – Anycorn

+0

non Vuol MSVS sostenere la direttiva #WARNING, troppo? –

risposta

4

In MSVS 2010 c'è questa:

#pragma deprecated(identifier1 [,identifier2, ...]) 

non conoscono altri compilatori

e Microsoft specifica:

__declspec(deprecated) void func1(int) {} 
__declspec(deprecated("** this is a deprecated function **")) void func2(int) {} 
__declspec(deprecated(MY_TEXT)) void func3(int) {} 
+2

L'equivalente GCC è '__attribute __ ((deprecato))', vedere http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html. –

+0

+1, penso che sia probabilmente meglio affrontare il problema reale (deprecating symbols) per poi hackerare con "message". Ha il bonus extra che, AFAIR, per gcc questa estensione è presente da molto tempo, probabilmente anche per il vecchio 3.4.5. –

+0

Sembra che questa sia la risposta alla domanda postata. Grazie. Ma, sembra che ho dimenticato di dire che A, B, C erano simboli # definiti e ora li ho fatti const const cnA, ... costanti. – sny

3

Non si può costruire #pragma o #warning con ma penso che si possa fare qualcosa del tipo:

#ifdef __GNUC__ 
# define Y_Warning(x) message x 
#else 
# define Y_Warning(x) message(x) 
#endif 

#pragma Y_Warning("Symbol A is depreboned. Use predefined const cnA instead.") 
#pragma Y_Warning("Symbol B is depronated. Use predefined const cnB instead.") 
#pragma Y_Warning("Symbol C is deprecuted. Use predefined const cnC instead.") 
+1

è possibile costruire le direttive '# pragma' tramite macro: C99 ha aggiunto l'operatore' _Pragma', che è supportato da gcc – Christoph

+0

MinGW v3.4.5 non supporta _Pragma e in questo progetto non riesco ad aggiornarlo sfortunatamente. – sny

+1

E sembra gcc doesn'texpand Y_Warning – sny

4

GCC supporta l'operatore C99 _Pragma e viene fornito con example code for your use case.

+1

+1 ma dubito che questo funzionerà con il vecchio minGW v3.4.5. E si dovrebbe forse aggiungere che, sì, '__GNUC__' è la macro corretta per verificare la presenza di gcc, qualsiasi sapore. –

+0

@Jens: una rapida ricerca su google ha mostrato che le correzioni per i problemi di '_Pragma' sono state inserite in gcc-3.2.x; funziona con cygwin-gcc 3.4.4, quindi ho il sospetto che mingw-gcc 3.4.5 dovrebbe anche essere ok; perché si dovrebbe usare una vecchia versione del compilatore è al di là di me, anche se ... – Christoph