サーチ…


前書き

これは、自分の作った実行時エラーチェックルーチンをどのようにして簡単に組み込むことができるのかを示しています。これにより、コードオフ時にコードオーバーヘッドが発生しません。

簡単な例

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

概念は基本的にこれです:

定義されたシンボルは、コードの使用を有効にするために使用されます。また、明示的にインライン化されているコードを停止します。つまり、チェックルーチンにブレークポイントを追加する方が簡単です。

しかし、この構成の本当の美しさは、もうチェックしたくないときです。 $ DEFINE (その前に '//'を置く)をコメントアウトすることによって、チェックコードを削除するだけでなく、ルーチンのインラインオンにして 、呼び出されたすべての場所からオーバーヘッドを取り除きますルーチン!コンパイラは、チェックのすべてのトレースを完全に削除します(もちろん、インライン展開自体は "On"または "Auto"に設定されているものとします)。

上の例は基本的に "アサーション"の概念に似ています。最初の行は、使用法に応じて結果をTRUEまたはFALSEに設定できます。

しかし、トレースロギング、メトリックなどを行うコードにこのような構成を自由に使用できるようになりました。例えば:

   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
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow