2010-11-17 41 views
12

Je veux désactiver un avertissement spécifique (W1035) dans mon code, car je pense que le compilateur se trompe sur cet avertissement:Comment puis-je désactiver temporairement l'avertissement "return value could be unfined"?

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

Il n'y a aucun moyen le résultat pourrait être indéfini, puisque Abort lancers francs EAbort.

J'ai essayé:

  • {$WARN 1035 Off}: Apparemment, cela ne fonctionne que pour quelques erreurs spécifiques (voir Documentation)
  • {$W-1035}: Est-ce que rien

Je sais que je peux désactiver l'avertissement globalement dans les options du projet, ou en utilisant {$WARNINGS OFF}, mais ce n'est pas ce qui est prévu ici.

Éditer: Je l'ai QC maintenant comme #89744.

+0

Alors que c'est vrai le compilateur est parfois confus et signale cet avertissement sans cause, dans ce cas le compilateur est techniquement correct. Le résultat n'est pas affecté avant le conditionnel et n'est affecté que sur la vraie branche du conditionnel. Le fait que la fonction retourne prématurément si la condition est fausse est sans importance pour le compilateur. –

+0

@codeelgance: Tout à fait vrai, mais je pense que 'Abort' est une fonction intégrée et le compilateur pourrait reconnaître la situation. –

Répondre

13

Vous ne pouvez pas désactiver cet avertissement globalement, mais vous pouvez utiliser le {$WARN NO_RETVAL OFF} pour désactiver localement l'avertissement.

{$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

D'où vous vient le 'NO_RETVAL', puisqu'il ne figure pas dans la documentation d'Embarcadero? –

+1

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

+0

Ok, donc la plupart (tous?) Des textes d'avertissement sont définis dans 'DCCStrs .pas', bon à savoir :) –

9

Je n'ai pas un compilateur Delphi disponible pour le moment, mais réarranger le code pour enlever le if..else pourrait faire l'avertissement disparaître:

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

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

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

+0

+1 Cela fonctionne (pour la situation particulière) et je n'y avais pas pensé, cela ne résout cependant pas le problème général. –

1

Vous pouvez utiliser une astuce pour tromper le compilateur. Définir une fonction de bibliothèque comme si:

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

Vous pouvez alors écrire votre fonction:

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

Le compilateur pense que vous avez écrit à résultat, car elle est un paramètre var et il cesse de bêler.