我知道我可以使用下面的结构检查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不需要使用指令,但我认为这是可行的方法。
发布于 2009-08-17 07:30:56
像这样修改你的程序
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-14 16:08:11
不,没有简单的方法可以做到这一点。编译器指令在与代码编译不同的级别上操作,并且它们不会将有关其状态的有意义的信息传递到代码中,并且它们肯定不会应用于其自身作用域之外。如果要将数据传递给过程,唯一的方法是使用变量,可以是参数,也可以是全局变量。
发布于 2009-08-14 16:09:22
据我所知,编译器指令只对正在编译的代码起作用,在本例中是“调用方法P3”,而不是P3方法本身的代码。
如果您在上面的代码中使用$IFOPT I+,P3将使用$I+进行编译(因为在上面稍微设置了一下),并且$IFOPT I+始终为真。
https://stackoverflow.com/questions/1278703
复制相似问题