2013-05-24 14 views
7

アサーションがDelphiでアクティブであるかどうかを確認する条件は何ですか?コンパイラオプション(アサーションなど)がONに設定されているかどうかをランタイムで検出するにはどうすればよいですか?

私はアサーションが有効でない場合、程度のヒントがあり、アサーションは、上記のコードで

procedure Whatever; 
var 
    v : Integer; 
begin 
    v := DoSomething; 
    Assert(v >= 0); 
end; 

のようなコードには有効でない場合、未使用の変数に関するヒントを抑制するために何かをできるようにしたいと思います変数vには使用されない値が割り当てられます。

このコードはさまざまな環境で使用されるライブラリに含まれているため、DEBUGのようなカスタム条件ではなく、特にアサーションをテストできます。

答えて

17

あなたは$IFOPTディレクティブ使用してこれを行うことができます。これは、コンパイラのヒントを抑制しますが、それはまたあなたを作る

procedure Whatever; 
{$IFOPT C+} 
var 
    v : Integer; 
{$ENDIF} 
begin 
    {$IFOPT C+}v := {$ENDIF}DoSomething; 
    {$IFOPT C+}Assert(v >= 0);{$ENDIF} 
end; 

:このような

{$IFOPT C+} 
    // this block conditionally compiled if and only if assertions are active 
{$ENDIF} 

ですから、再書き込み可能性があなたのコードを目が出血。

私はおそらく、このようにそれを抑制します:抑制機能は、受信

procedure SuppressH2077ValueAssignedToVariableNeverUsed(const X); inline; 
begin 
end; 

procedure Whatever; 
var 
    v : Integer; 
begin 
    v := DoSomething; 
    Assert(v >= 0); 
    SuppressH2077ValueAssignedToVariableNeverUsed(v); 
end; 

型なしパラメータは、H2077を抑制するのに十分です。また、inlineを使用すると、関数呼び出しがないためコンパイラはコードを出力しません。

+2

あなたの 'suppress ...'メソッドの名前は+1とlolです。それらのヒントを抑制する素晴らしい方法。同じ目的を果たす任意のステートメントにコメントを追加するよりもずっと優れています。 –

+0

@MarjanVenemaはい、私はコメントの必要性を取り除くコードを好む傾向があります。 –

+0

素敵なトリック!私はインライン関数でAssertをラップしようとしましたが(最適化されています)、ヒントはまだそこに残っていました。 –

関連する問題