2010-11-17 11 views
12

Quiero desactivar una advertencia específica (W1035) en mi código, ya que creo que el compilador es equivocado sobre esta advertencia:¿Cómo puedo desactivar temporalmente la advertencia "el valor de retorno puede estar indefinido"?

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

No hay ninguna manera el resultado podría ser indefinido, ya que Abort tiros EAbort.

me trataron:

  • {$WARN 1035 Off}: Al parecer, esto sólo funciona para algunos errores específicos (ver Documentation)
  • {$W-1035}: no hace nada en absoluto

Sé que puedo apagar la alerta globalmente en las opciones del proyecto, o usando {$WARNINGS OFF}, pero eso no es lo que se pretende aquí.

Editar: Tengo QC'ed esto ahora como #89744.

+0

Si bien es cierto que el compilador a veces se confunde e informa esta advertencia sin causa, en este caso el compilador es técnicamente correcto. El resultado no se asigna antes del condicional y solo se asigna en la rama verdadera del condicional. El hecho de que la función regrese prematuramente si la condición es falsa es irrelevante para el compilador. –

+0

@codeelgance: Muy cierto, pero creo que 'Abort' es una función integrada y el compilador podría reconocer la situación. –

Respuesta

13

no puede deshabilitar esta advertencia globalmente, pero puede usar el {$WARN NO_RETVAL OFF} para deshabilitar localmente la advertencia.

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

¿De dónde sacaste el 'NO_RETVAL', ya que no está en la documentación de Embarcadero? –

+1

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

+0

Ok, ¿entonces la mayoría (¿todos?) De los textos de advertencia están definidos en 'DCCStrs .pas', es bueno saber :) –

9

que no tienen un compilador de Delphi disponible en este momento, pero reordenar el código para eliminar el if..else podría hacer que el aviso desaparece:

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

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

Véase también How to disable a warning in Delphi about “return value … might be undefined”?.

+0

+1 Eso funciona (para la situación particular) y no había pensado en eso, sin embargo, no soluciona el problema general. –

1

Puede usar un buen truco para engañar al compilador. Definir una función de biblioteca como tal:

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

entonces usted puede escribir su función como:

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

El compilador piensa que has escrito al resultado, ya que es un parámetro var y que se detenga balando.

Cuestiones relacionadas