【问题标题】:Can specific Delphi hints be disabled?可以禁用特定的 Delphi 提示吗?
【发布时间】:2010-10-01 11:04:27
【问题描述】:

在Delphi中,您可以使用编译器指令来禁用特定的警告,例如

{$WARN USE_BEFORE_DEF OFF}

但是当我尝试使用特定提示(我从帮助文件中获取其下划线样式名称)来执行此操作时,编译器说它不知道 {$HINT} 是什么。那么有没有办法做到这一点呢?

【问题讨论】:

  • 为什么要禁用提示?无论如何,你得到提示的东西都会被 EXE 中的编译器消除,所以你保证不会影响程序的执行。
  • 因为我不喜欢生成提示和警告,而且我可以通过阅读代码看到它在此提示中警告我的可能情况不适用于这种情况。跨度>
  • 我不同意,提示大部分时间都是有效的。我们有一个成功的 0 提示策略
  • 是的。大多数时候他们是。但是,在这种情况下,编译器不理解“raise”退出了过程。
  • @everybody_saying_not_to_turn_off_hints:肯定有编译器警告和错误提示。通常在复杂的代码中会发生这样的事情:如果我初始化一个变量,它会告诉我,分配给它的值将不会被使用,如果我不这样做,它会告诉我它可能没有被初始化。还有其他奇怪的事情,但这个最发生在我身上。 (那是Delphi 2007,可能已经在以后的版本中修复了)

标签: delphi compiler-construction directive hints


【解决方案1】:

没有具体的提示,但您可以全部禁用。

{$HINTS OFF}
procedure MyProc;
var
  i : integer;
begin
  DoSomething;
end;
{$HINTS ON}

【讨论】:

  • 是的,这就是我害怕的。
【解决方案2】:

小题外话:您应该注意编译器的提示和警告。他们不只是为了好玩。编译器只是说“程序的工作方式可能与您认为的不同,因为您的源代码不准确”。

【讨论】:

  • 是的,提示是你的朋友。不要讨厌提示。
  • 我查看了 Mason 的代码并向他展示了如何修复提示。这是一个未定义的 else 条件。我从来没有遇到过我无法修复的提示或警告。编译器是我的朋友。
  • 但是......在某些情况下它绝对是有意义的。仅举一个例子:对于H2457,您几乎无能为力,除了为了让编译器停止抱怨而重构大量代码。那将是仅禁用该特定功能的经典示例。没有内联特定调用并不是世界末日,所以闭嘴,编译器!
【解决方案3】:

为了安全起见,我们想做这样的事情:

function TopazGetText(const _s: string): string;
begin
{$IFOPT <something>+}
{$DEFINE HINTS_WERE_ON}
{$HINTS OFF}
{$ELSE}
{$UNDEF HINTS_WERE_ON}
{$ENDIF}
  Result := dzDGetText(_s, TOPAZ_TRANSLATION_DOMAIN);
{$IFDEF HINTS_WERE_ON}
{$HINTS ON}
{$ENDIF}
end;

不幸的是,似乎没有用于检查提示是否关闭的编译器指令,因此您不能这样做。 (H+ 不是用于提示,而是用于长字符串)。 此外,HINTS OFF / ON 在函数/过程中不起作用。

所以你最终会为整个函数无条件地关闭和打开提示:

{$HINTS OFF}
function TopazGetText(const _s: string): string;
begin
  Result := dzDGetText(_s, TOPAZ_TRANSLATION_DOMAIN);
end;
{$HINTS ON}

(编译器曾经告诉我它不能内联 dzDGetText,在这种情况下我并不关心,我不想看到提示,因为这会阻止我(和我的同事)关心关于重要提示。)

【讨论】:

    【解决方案4】:

    我能想到的最好的办法是用条件定义包围提示的主题,并在可能需要或可能不需要的代码周围使用相同的条件定义,如下所示:

    如果你有这个:

    procedure MyProc;
    var
      i : integer;
    begin
      DoSomething;
      //SomethingWith_i_IsCommentedOut;
    end;
    

    您将获得: 提示:变量“i”已声明但从未使用过

    所以试试这个吧:

    procedure MyProc;
      {$IFDEF USE_THE_I_PROCEDURE}
    var
      i : integer;
      {$ENDIF}
    begin
      DoSomething;
      {$IFDEF USE_THE_I_PROCEDURE}
      SomethingWith_i_IsCommentedOut;
      {$ENDIF}
    end;
    

    现在您可以打开或关闭定义,而且您永远不会得到提示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多