2013-05-24 15 views
7

Qual è il condizionale per verificare se le asserzioni sono attive in Delphi?Come rilevare in runtime se alcune opzioni del compilatore (come le asserzioni) erano impostate su ON?

mi piacerebbe essere in grado di fare qualcosa per reprimere i suggerimenti circa le variabili non utilizzate quando le affermazioni non sono attivi in ​​codice come

procedure Whatever; 
var 
    v : Integer; 
begin 
    v := DoSomething; 
    Assert(v >= 0); 
end; 

Nel codice precedente, quando le affermazioni non sono attivi, v'è un accenno su alla variabile v viene assegnato un valore che non viene mai utilizzato.

Il codice si trova in una libreria che verrà utilizzata in vari ambienti, quindi sarei in grado di verificare le asserzioni in modo specifico e non un condizionale personalizzato come DEBUG.

risposta

17

È possibile farlo utilizzando la direttiva $IFOPT:

{$IFOPT C+} 
    // this block conditionally compiled if and only if assertions are active 
{$ENDIF} 

Così si potrebbe ri-scrivere il codice come questo:

procedure Whatever; 
{$IFOPT C+} 
var 
    v : Integer; 
{$ENDIF} 
begin 
    {$IFOPT C+}v := {$ENDIF}DoSomething; 
    {$IFOPT C+}Assert(v >= 0);{$ENDIF} 
end; 

questo modo si sopprimono il suggerimento del compilatore, ma rende anche la vostra gli occhi sanguinano.

avrei probabilmente sopprimere in questo modo:

procedure SuppressH2077ValueAssignedToVariableNeverUsed(const X); inline; 
begin 
end; 

procedure Whatever; 
var 
    v : Integer; 
begin 
    v := DoSomething; 
    Assert(v >= 0); 
    SuppressH2077ValueAssignedToVariableNeverUsed(v); 
end; 

Il parametro tipizzato che la funzione di soppressione riceve è sufficiente per sopprimere H2077. E l'uso di inline significa che il compilatore non emette alcun codice poiché non vi è alcuna chiamata di funzione.

+2

+1 e lol per il nome del metodo 'sopprimi ...'. Ottimo modo di sopprimere questi suggerimenti. Molto meglio che aggiungere un commento ad alcune affermazioni arbitrarie che servono allo stesso scopo. –

+0

@ MarjanVenema Sì, tendo a favorire il codice che ovvia alla necessità di commenti. –

+0

Bel trucco! Avevo provato a completare l'Assert in una funzione inline (anch'essa ottimizzata), ma il suggerimento era ancora lì, con il tuo è sparito! –