2010-11-14 13 views

risposta

-2

Con "costrutti deprecati" si intende realmente "funzioni membro deprecate". Stai chiedendo un avviso in fase di compilazione per attirare la tua attenzione sul sito di chiamata di qualsiasi funzione deprecata.

Questo non è possibile in alcun modo ragionevole nel C++ standard e non vedo alcun attributo in G ++ che supporti questo. Qt non può davvero aggiungere una funzione come quella se il compilatore non ha già un supporto per farlo.

Tuttavia, Microsoft Visual C++ supporta un'estensione __declspec(deprecated) e immagino sia possibile scrivere un plug-in del compilatore per G ++ 4.5 che aggiunga una funzionalità simile.

+0

Sembra che mi sia mancato '__attribute __ ((deprecato))' in G ++. –

0

Si potrebbe desiderare di fare qualcosa di simile da soli:

#ifdef Q_TREAT_OBSOLETE_AS_ERRORS 
#define Q_OBSOLETE(X) \ 
     BOOST_STATIC_ASSERT(false); \ 
     X 

#else 
#define Q_OBSOLETE(X) X 
#endif 

Questa costruzione sostituisce semplicemente qualche deprecato codice/parte del codice, se non v'è alcuna Q_TREAT_OBSOLETE_AS_ERRORS definito e genera errore di compilazione-tempo altrimenti.

Nota che BOOST_STATIC_ASSERT non ha limiti di ambito, così come la macro Q_OBSOLETE.

Probabilmente questo non è il modo migliore per risolvere il problema e in realtà non sono sicuro che sia utile.

Si potrebbe semplicemente contrassegnare il codice come @obsolete o semplicemente indicarlo nei commenti.

+0

Questo non funziona. Ciò causerà errori di compilazione se il codice deprecato è ** compilato **, indipendentemente dal fatto che il codice sia chiamato da qualche altra parte. –

+0

@Ken Beh, è ​​ovvio che non si ha un modo per verificare se un chunk di codice viene effettivamente chiamato. Questa cosa delle asserzioni statiche aiuta semplicemente a richiamare l'attenzione sulla compilazione di funzionalità deprecate. * In realtà, tutta questa roba di Q_OBSOLETE sembra abbastanza inutile per me.* –

+0

sta chiedendo (credo) perché è abituato a Java, che può annotare le funzioni come deprecato e fornire un avviso al compilatore quando si tenta di utilizzarle. –

1

Basta utilizzare la direttiva

#warning 

anche se non è il C++ standard è abbastanza improbabile si incontra un compilatore che non lo supporta (see this SO question).

+0

Windows/MSVC è un obiettivo abbastanza comune con Qt, quindi non sono d'accordo con "abbastanza improbabile". –

1
  1. Estrarre la funzione reale dall'ambito pubblico.
  2. Creare un'altra funzione con lo stesso nome in ambito pubblico.
  3. Inserire il codice di avviso/errore in quella funzione.
  4. Chiama l'originale con il nuovo.
+2

Impossibile emettere un avviso di compilazione in questo modo. –

31

Se si utilizza Q_DECL_DEPRECATED si dovrebbe ottenere il risultato che si sta cercando ad es .:

Q_DECL_DEPRECATED void foo(); 
+6

questa dovrebbe essere la risposta accettata. – dom0

Problemi correlati