【问题标题】:Disabling overflow checks in Delphi在 Delphi 中禁用溢出检查
【发布时间】:2012-07-25 20:42:48
【问题描述】:

这是一个后续问题,与我在 stackoverflow 上阅读的另一个问题上看到的答案有关。如果我希望禁用特定函数的溢出检查(根据this question),此代码是否会导致在运行该函数后突然启用溢出检查,即使之前未在编译器选项或代码中启用它?

{$OVERFLOWCHECKS OFF}
// function here
{$OVERFLOWCHECKS ON}

我是否需要将它与 IFOPT 块(可能类似于 this 示例?)结合起来以将溢出检查返回到以前的状态(以免意外启用对非调试版本的溢出检查)?还是两者不同,这就足够了?奖励:如果我确实需要 IFOPT,有条件地禁用溢出检查的具体语法是什么?

【问题讨论】:

  • 我个人认为应该对溢出检查特定的代码进行单元测试,并在单元顶部使用 {$OVERFLOWCHECKS On/Off} 进行硬编码,明确覆盖项目设置,并且然后编写并测试您的代码,以免项目设置破坏您的单元。

标签: delphi


【解决方案1】:

是的,您发布的 sn-p 将自动启用溢出检查,无论之前是什么。

这应该可行。如果您愿意,可以将{$Q+}{$Q-} 分别替换为{$OVERFLOWCHECKS ON}{$OVERFLOWCHECKS OFF}

{$IFOPT Q+}
  {$DEFINE OVERFLOW_ON}
  {$Q-}
{$ELSE}
  {$UNDEF OVERFLOW_ON}
{$ENDIF}
//
// Your code here
// 
{$IFDEF OVERFLOW_ON}
  {$Q+}
  {$UNDEF OVERFLOW_ON}
{$ENDIF}

【讨论】:

  • 这看起来太复杂了,因为 $Q 的范围是本地的,看起来如果单位不是太大,如果只是禁用/启用指令就可以了,除非你正在处理非常复杂的项目和非常复杂的团队。
  • @jachguate,不,不是。关闭和打开它会影响两者之间的代码,但是如果您将其保持打开状态,它将保持打开状态,直到其他地方对其进行更改。如果您之后没有在其他地方专门将其关闭,它会影响其他编译的所有内容(至少在该单元中,可能更多)。尝试一下。就复杂性而言,您可以轻松构建一个代码模板,只需几次击键和 Ctrl+J(或制表符或空格,如果您以这种方式设置模板)即可为您完成所有工作。
  • 上述技术有效,但我不推荐给 OP。
  • @WarrenP,好的。那你为什么要告诉我? :-) 有时需要为某个程序(甚至几行代码)打开/关闭某些东西,而仅为该程序创建一个新单元是没有意义的。只要你清楚自己在做什么,这样做并没有错。 (我回答了所提出的问题。)
  • 我在很多情况下都需要这样做,主要是当我调用一个库(如 LockBox3)时,如果启用了溢出和/或范围检查,则会引发异常。我同意上述技术是正确的方法;但是,在您合并这些指令后,您必须构建您的代码,而不仅仅是编译它,否则切换将神秘地不起作用!
猜你喜欢
  • 1970-01-01
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多