2009-08-14 96 views
0

我知道,我可以用这个结构检查德尔福的开关指令的当前状态:(德尔福)检查状态

{$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不需要使用指令,但我认为这是要走的路。

回答

1

更改您的PROGRAMM这样

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; 
+0

我想到了,但这正是我想要避免的: -/ – kaeff 2009-08-17 19:59:05

+0

@kaeff也许如果你说出为什么要避免这种解决方案,那么你可以得到另一个。如果您可以更改P3的主体,但不更改参数列表,请使用变量。或者当你不能确保所有的调用者都合作时,你可以引发一个范围违规并检查是否抛出异常。 – 2009-08-18 08:02:27

4

不,没有简单的方法来做到这一点。编译器指令的运行级别不同于代码编译级别,并且它们不会将有关其状态的有意义的信息传递到代码中,而且它们当然不适用于他们自己的范围之外。如果你想将数据传递给一个过程,唯一的方法就是使用一个变量,一个参数或一个全局变量。

0

据我所知,编译器指令只适用于正在编译的代码,在这种情况下,“调用方法P3”,而不是方法P3本身的代码。

如果您要在上面的代码中使用$ IFOPT I +,那么P3将被编译为$ I +(因为设置得稍微高于),并且$ IFOPT I +始终为真。

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