2010-11-17 12 views
12

Voglio disabilitare un avvertimento specifico (W1035) nel mio codice, in quanto credo che il compilatore è sbagliato su questo avvertimento:Come disattivare temporaneamente l'avviso "Il valore restituito potrebbe essere indefinito"?

function TfrmNagScreen.Run: TOption; 
begin 
    if ShowModal = mrOk then 
    Result := TOption(rdgAction.EditValue) 
    else 
    Abort 
end; 

v'è alcun modo il risultato potrebbe essere indefinito, in quanto Abort tiri EAbort.

ho provato:

  • {$WARN 1035 Off}: A quanto pare questo funziona solo per alcuni errori specifici (vedi Documentation)
  • {$W-1035}: non fa niente affatto

So di poter spegnere l'allarme globalmente nelle opzioni del progetto, o usando {$WARNINGS OFF}, ma non è quello che è inteso qui.

Modifica: l'ho QC ora come #89744.

+0

Mentre è vero il compilatore a volte si confonde e segnala questo avviso senza motivo, in questo caso il compilatore è tecnicamente corretto. Il risultato non viene assegnato prima del condizionale e viene assegnato solo al ramo vero del condizionale. Il fatto che la funzione ritorni prematuramente se la condizione è falsa è irrilevante per il compilatore. –

+0

@codeelgance: abbastanza vero, ma penso che 'Abort' sia una funzione incorporata e il compilatore possa riconoscere la situazione. –

risposta

13

non è possibile disattivare questo avviso a livello globale, ma è possibile utilizzare lo {$WARN NO_RETVAL OFF} per disabilitare localmente l'avviso.

{$WARN NO_RETVAL OFF} 
function TfrmNagScreen.Run: TOption; 
begin 
    if ShowModal = mrOk then 
    Result := TOption(rdgAction.EditValue) 
    else 
    Abort 
end; 
{$WARN NO_RETVAL ON} 
+0

Da dove è stato ottenuto il 'NO_RETVAL', poiché non è nella documentazione di Embarcadero? –

+1

@Jens, consultare http://stackoverflow.com/questions/376785/identifiers-for-delphis-warn-compiler-directive/377034#377034 – WileCau

+0

Ok, quindi la maggior parte (tutti?) Dei testi di avviso sono definiti in 'DCCStrs .pas', buono a sapersi :) –

9

Non ho un compilatore Delphi disponibile al momento, ma riorganizzare il codice per rimuovere il if..else potrebbe rendere l'avvertimento andare via:

function TfrmNagScreen.Run: TOption; 
begin 
    if ShowModal <> mrOk then 
    Abort; 

    Result := TOption(rdgAction.EditValue); 
end; 

Vedi anche How to disable a warning in Delphi about “return value … might be undefined”?.

+0

+1 Funziona (per la situazione particolare) e non ci avevo pensato, non risolve il problema generale. –

1

È possibile utilizzare un trucco per ingannare il compilatore. Definire una funzione di libreria come così:

procedure Abort(var X); 
begin 
    SysUtils.Abort; 
end; 

È possibile quindi scrivere la funzione di:

if ShowModal = mrOk then 
    Result := TOption(rdgAction.EditValue) 
else 
    Abort(Result) 

Il compilatore pensa che hai scritto al risultato dal momento che è un parametro var e si ferma belare.

Problemi correlati