Suche…


Einführung

Dies zeigt, wie eine selbst erstellte Laufzeitfehlerüberprüfungsroutine problemlos integriert werden kann, sodass beim Ausschalten kein Code-Overhead entsteht.

Triviales Beispiel

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

Das Konzept ist im Grunde Folgendes:

Das definierte Symbol wird verwendet, um die Verwendung des Codes zu aktivieren. Dadurch wird auch verhindert, dass der Code explizit eingebettet wird, sodass es einfacher ist, einen Haltepunkt in die Prüfroutine einzufügen.

Allerdings ist die wahre Schönheit dieser Konstruktion , wenn Sie die Prüfung wollen nicht mehr. Durch das Auskommentieren des $ DEFINE (setzen Sie "//" davor), entfernen Sie nicht nur den Prüfcode, sondern schalten auch die Inline für die Routine ein und entfernen so alle Overheads an allen Stellen, an denen Sie aufgerufen haben die Routine! Der Compiler entfernt alle Spuren Ihrer Prüfung vollständig (vorausgesetzt natürlich, dass das Inlining auf "Ein" oder "Auto" gesetzt ist).

Das obige Beispiel ist im Wesentlichen dem Konzept der "Assertions" ähnlich, und Ihre erste Zeile könnte das Ergebnis entsprechend der Verwendung auf TRUE oder FALSE setzen.

Sie können diese Konstruktionsweise jetzt aber auch für Code verwenden, der Traceprotokollierung, Metriken usw. durchführt. Zum Beispiel:

   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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow