Zoeken…


Invoering

Dit laat zien hoe een runtime-foutcontroleroutine die u zelf maakt eenvoudig kan worden opgenomen, zodat het geen code-overhead genereert wanneer het wordt uitgeschakeld.

Triviaal voorbeeld

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

Het concept is eigenlijk dit:

Het gedefinieerde symbool wordt gebruikt om het gebruik van de code in te schakelen. Het voorkomt ook dat de code expliciet in een lijn wordt geplaatst, wat betekent dat het gemakkelijker is om een breekpunt in de controleroutine te plaatsen.

Maar de echte schoonheid van deze constructie is wanneer u de cheque niet meer wilt. Door commentaar te geven op $ DEFINE (plaats '//' ervoor) verwijdert u niet alleen de controlecode, maar schakelt u ook de inline in voor de routine en verwijdert u dus alle overheadkosten van alle plaatsen waar u hebt opgeroepen de routine! De compiler verwijdert alle sporen van uw cheque volledig (ervan uitgaande dat de inline zelf is ingesteld op "Aan" of "Auto", natuurlijk).

Het bovenstaande voorbeeld is in wezen vergelijkbaar met het concept van "beweringen" en uw eerste regel kan het resultaat instellen op WAAR of ONWAAR, afhankelijk van het gebruik.

Maar je bent nu ook vrij om deze manier van bouwen te gebruiken voor code die trace-logging doet, statistieken, wat dan ook. Bijvoorbeeld:

   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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow