0

この構成を使用して、Delphiのスイッチディレクティブの現在の状態を確認できることを知っています。

{$IFOPT R+}
      Writeln('Compiled with range-checking');
{$ENDIF}

Delphiバックエンドコンパイラがどのように機能するかについての詳細な情報源が不足しているため、関数を呼び出すコード行のスイッチディレクティブの状態に応じて関数の動作を変更する方法があるかどうかはわかりません。次のようになります。

procedure P1;
begin  
    {$I+}
    P3; 
    {$I-}
end;

// ** state of I unknown

procedure P2;
begin
    {$I-}   
    P3; 
    {$I+}
end;

// ** state of I unknown

procedure P3;
begin       
    // Something like {$IFOPT I+}, but at the state P3 is called
    DoThis;
    {$ELSE}
    DoThat
    {$ENDIF}
end; 

早急に手つかずのままにしておきたいレガシーコード用のアダプターを書いています。P3はディレクティブを使用する必要はありませんが、これが進むべき道だと思いました。

4

4 に答える 4

4

いいえ、それを行う簡単な方法はありません。コンパイラ指令は、コードのコンパイルとは異なるレベルで動作し、その状態に関する意味のある情報をコードに渡さず、独自のスコープ外に適用されることはありません。プロシージャにデータを渡したい場合、それを行う唯一の方法は、引数またはグローバルのいずれかの変数を使用することです。

于 2009-08-14T16:08:10.570 に答える
1

このようにプログラムを変更します

procedure P1;
begin  
    {$I+}
    P3(true); 
    {$I-}
end;

procedure P2;
begin
    {$I-}       
    P3(false); 
    {$I+}
end;

// ** state of I unknown, but the parameter know the state

procedure P3(WIthRangeCheck: Boolean);
begin       
    if WIthRangeCheck then
       DoThis
    else
       DoThat;
end;
于 2009-08-17T07:30:56.183 に答える
0

私の知る限り、コンパイラ指令はコンパイル中のコード、この場合は「メソッドP3の呼び出し」でのみ機能し、メソッドP3自体のコードでは機能しません。

上記のコードで$IFOPTI +を使用する場合、P3は$ I +でコンパイルされ(少し上に設定されているため)、$ IFOPTI+は常にtrueです。

于 2009-08-14T16:09:22.223 に答える
0

Delphi XE2では、{$ IFOPTI+}は希望どおりに機能します。

procedure Test_IO_checkStatus(var isON: Boolean);
begin
{Ifopt I+}
  isON := true
  {$Else}
  isON := false;
  {Endif}
end;

プロジェクトが{$I+}でコンパイルされたときに呼び出すと、TRUEが返されます。{$I-}で再コンパイルするとFALSEが返されます

于 2014-02-01T17:07:21.697 に答える