Sök…


Introduktion

Detta visar hur en rutin för felkontroll av din egen tillverkning enkelt kan integreras så att den inte genererar någon kodomkostnad när den är avstängd.

Trivialt exempel

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

Konceptet är i princip detta:

Den definierade symbolen används för att aktivera användningen av koden. Det hindrar också att koden uttryckligen är fodrad, vilket innebär att det är lättare att sätta en brytpunkt i kontrollrutinen.

Men den verkliga skönheten i denna konstruktion är när du inte vill ha kontrollen längre. Genom att kommentera $ DEFINE (sätta '//' framför den) tar du inte bara bort kontrollkoden, utan du sätter också inline för rutinen och därmed tar bort eventuella omkostnader från alla platser där du åberopade rutinen! Kompilatorn tar bort alla spår på din check helt (förutsatt att själva inlining är inställt på "On" eller "Auto", naturligtvis).

Exemplet ovan liknar väsentligen begreppet "påståenden", och din första rad kan ställa resultatet till SANT eller FALSE som är lämpligt för användningen.

Men du är nu också fri att använda detta konstruktionssätt för kod som spårloggning, mätvärden, vad som helst. Till exempel:

   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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow