0

我知道我可以使用以下构造检查 Delphi 的 switch 指令的当前状态:

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

由于我缺乏关于 Delphi 后端编译器如何工作的深入资源,我不确定是否有一种方法可以根据调用它的代码行中 switch 指令的状态来改变函数的行为。它看起来像这样:

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 本身的代码。

如果您在上面的代码中使用 $IFOPT I+,P3 将使用 $I+ 进行编译(因为上面设置了一点)并且 $IFOPT I+ 始终为真。

于 2009-08-14T16:09:22.223 回答
0

在 Delphi XE2 中,{$IFOPT I+} 完全按照您的要求工作:

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 回答