Ricerca…


introduzione

Questo mostra come una routine di controllo degli errori di runtime della tua creazione può essere facilmente incorporata in modo che non generi alcun overhead di codice quando viene spento.

Esempio banale

{$DEFINE MyRuntimeCheck} // Comment out this directive when the check is no-longer required!
                         // You can also put MyRuntimeCheck in the project defines instead.

   function MyRuntimeCheck: Boolean;  {$IFNDEF MyRuntimeCheck} inline;  {$ENDIF}
   begin
      result := TRUE;
      {$IFDEF MyRuntimeCheck}
        // .. the code for your check goes here
      {$ENDIF}
   end;

Il concetto è fondamentalmente questo:

Il simbolo definito viene utilizzato per attivare l'uso del codice. Inoltre, impedisce al codice di essere esplicitamente allineato, il che significa che è più facile inserire un punto di interruzione nella routine di controllo.

Tuttavia, la vera bellezza di questa costruzione è quando non vuoi più controllare. Annunciando il $ DEFINE (messo di fronte a "//") non solo rimuoverai il codice di controllo, ma accenderai anche l' inline per la routine e quindi rimuoverai eventuali overhead da tutti i punti in cui hai invocato la routine! Il compilatore rimuoverà completamente tutte le tracce del tuo assegno (assumendo che l'inlining stesso sia impostato su "On" o "Auto", ovviamente).

L'esempio sopra è essenzialmente simile al concetto di "asserzioni" e la tua prima riga potrebbe impostare il risultato su VERO o FALSO in base all'utilizzo.

Ma ora sei anche libero di usare questo metodo di costruzione per il codice che fa traccia-logging, metrica, qualunque cosa. Per esempio:

   procedure MyTrace(const what: string);  {$IFNDEF MyTrace} inline;  {$ENDIF}
   begin
      {$IFDEF MyTrace}
        // .. the code for your trace-logging goes here
      {$ENDIF}
   end;
...
MyTrace('I was here');   // This code overhead will vanish if 'MyTrace' is not defined.
MyTrace( SomeString );   // So will this.


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow