Delphi:如何使用$ OVERFLOWCHECKS OFF来禁用溢出检查?

时间:2010-03-10 15:49:21

标签: delphi delphi-5 integer-overflow

我有一些导致下溢的代码:

var
    t1, t2, delta: DWORD:
begin
   t1 := 0xffffff00;
   t2 := 0x00000037;

   delta := (t2 - t1);

减法本身生成溢出(下溢),但我不希望Delphi抛出EIntOverflow异常。所以我尝试通过禁用溢出检查来禁止生成溢出检查代码:

var
    t1, t2, delta: DWORD:
begin
   t1 := 0xffffff00;
   t2 := 0x00000037;

{$OVERFLOWCHECKS OFF}
   delta := (t2 - t1);
{$OVERFLOWCHECKS ON}

即使使用OVERFLOWCHECKS OFF选项,它仍会抛出异常。生成的代码仍然包含检查:

alt text http://i43.tinypic.com/intmrl.jpg

提醒您$Q的文档:

  

溢出检查

     

键入切换
  语法 {$ Q +}或{$ Q-}
      {$ OVERFLOWCHECKS ON}或{$ OVERFLOWCHECKS OFF}
  默认 {$ Q-}
            {$ OVERFLOWCHECKS OFF}
  范围本地

     

备注

     

$ Q指令控制   生成溢出检查代码。   在{$ Q +}状态,某个整数   算术运算(+, - ,*,Abs,   Sqr,Succ,Pred, Inc Dec )是   检查溢出。代码   每个这些整数运算   操作之后是额外的   验证结果的代码   在支持的范围内。如果   溢出检查失败,一个EIntOverflow   提出异常(或程序是   如果是异常处理则终止   没有启用)。

     

$ Q开关通常用于   与$ R开关一起使用   启用和禁用生成   范围检查代码。启用溢出   检查会降低你的程序速度   使它更大,所以使用{$ Q +}   仅用于调试。

如何使用$OVERFLOWCHECKS OFF禁用溢出检查代码的生成?


梅森的回答奏效了。修订后的代码是:

var
    t1, t2, delta: DWORD:
begin
   t1 := 0xffffff00;
   t2 := 0x00000037;

   delta := Subtract(t2, t1);


{$OVERFLOWCHECKS OFF}
function Subtract(const B, A: DWORD): DWORD; //subtract B-A
begin
   {
      Disabling overflow checking does not work at the line level,
      only the routine level. 
      Hence the function to subtract two numbers.
   }
   Result := (B-A);
end;
{$OVERFLOWCHECKS ON}

对于Google抓取工具,备用问题措辞:如何暂时禁用Delphi中的溢出检查?

1 个答案:

答案 0 :(得分:13)

它在行级别不起作用。您需要为整个功能关闭它。