2013-05-24 11 views
7

Na czym polega warunkowość sprawdzania, czy asercje są aktywne w Delphi?Jak wykryć w środowisku wykonawczym, jeśli jakaś opcja kompilatora (np. Asercje) była ustawiona na ON?

Chciałbym móc coś zrobić, aby stłumić wskazówek dotyczących nieużywanych zmiennych gdy twierdzenia nie są aktywne w kodzie jak

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

w powyższym kodzie, gdy twierdzenia nie są aktywne, nie jest to wskazówka o zmienna v ma przypisaną wartość, która nigdy nie jest używana.

Kod znajduje się w bibliotece, która będzie używana w różnych środowiskach, więc będę mógł przetestować pod kątem konkretnych stwierdzeń, a nie niestandardowych warunków takich jak DEBUG.

Odpowiedz

17

Można to zrobić za pomocą dyrektywy $IFOPT:

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

Więc może ponownie napisać kod tak:

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

ten wstrzyma wskazówkę kompilatora, ale także sprawia, że ​​Twój oczy krwawią.

I pewnie stłumić to tak:

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

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

bez typu parametru, że funkcja tłumić otrzyma wystarczające do powstrzymania H2077. A użycie inline oznacza, że ​​kompilator nie generuje żadnego kodu, ponieważ nie ma wywołania funkcji.

+2

+1 i lol dla nazwy metody "suppress ...". Świetny sposób na stłumienie tych wskazówek. Znacznie lepsze niż dodanie komentarza do jakiejś arbitralnej wypowiedzi, która służy temu samemu celowi. –

+0

@MarjanVenema Tak, staram się faworyzować kod, który eliminuje potrzebę komentowania. –

+0

Dobra sztuczka! Próbowałem owijać Assert w funkcję inline (która również została zoptymalizowana), ale podpowiedź wciąż tam była, a twoja zniknęła! –

Powiązane problemy