我知道我可以使用这个结构来检查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不需要使用指令,但我认为这是要走的路。
答案 0 :(得分:4)
不,没有简单的方法可以做到这一点。编译器指令在与代码编译不同的级别上运行,并且它们不会将有关其状态的有意义信息传递到代码中,并且它们当然不适用于自己的范围之外。如果要将数据传递给过程,唯一的方法是使用变量,无论是参数还是全局变量。
答案 1 :(得分: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;
答案 2 :(得分:0)
据我所知,编译器指令仅适用于正在编译的代码,在本例中是“调用方法P3”,而不是方法P3本身的代码。
如果您在上面的代码中使用$ IFOPT I +,P3将使用$ I +进行编译(因为设置如此高一点)并且$ IFOPT I +始终为真。
答案 3 :(得分: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