如何在不抑制所有提示的情况下处理虚假"H2077 Value assigned to '%s' never used"消息?



Delphi(10.3 Rio(针对以下代码发出虚假的H2077警告:

x := TFoo.Create;
y := nil;
try
y := function_that_can_throw;
// use x and y
finally
x.Free;
y.Free;
end;

注意:即使编译器能够证明函数不能抛出,该警告仍然是不需要的,因为AFAIK无法通过像其他语言中那样声明nothrow来将函数锁定为非抛出状态,从而在调用站点断言nothrow属性。因此,代码必须在函数可以抛出的假设下编写。

我想抑制无用/错误的提示,但显然不可能具体抑制提示H2077,只抑制所有提示或不抑制。如果可能的话,我想让提示处于启用状态,所以我想知道在这种情况下是否有其他选项可以抑制H2077。

此外,我希望避免对冗余的第二个try/finally帧进行编码,因为它扰乱了源代码并创建了不必要的目标代码。最简单、最明显的替代方法是调用一个空的伪过程,如pretend_to_use(y),它接受一个TObject参数,但对它不做任何操作,这将创建一个不必要的全局依赖项,并且很可能还会创建多余的函数调用。因此,我想听听你对更好的解决方案的建议。。。

EDIT:事实证明Andreas有道理,上面的代码片段没有创建虚假的警告(编译器中的特殊编码?(。以下是一个经过修改的片段,它确实导致了不必要的提示:

TIdStack.IncUsage;
y := nil;
try
y := function_that_can_throw;
// use y and the Indy stack
finally
TIdStack.DecUsage;
y.Free;
end;

Indy堆栈是我目前正在处理的事情,但进入/离开关键部分可能是更常见的情况。

如果你真的想抑制H2077,下面是我的方法。

在我的";实用程序包括";单元我有一些例程,比如:

procedure preventCompilerHint(I: integer); overload;

procedure preventCompilerHint(S: string); overload;

这些是EMPTY例程,仅由begin end;块组成。

我只是简单地调用这些例程来向编译器表明;使用";有问题的变量。

如果你和我一样&希望能够进行构建并看到零提示和零警告。。。这就是我处理H2077的方法。

有人可能会说这不太优雅。有时这可能是真的。在其他时候,我只是想抑制这个提示,然后继续前进

随你怎么做。。。

注意:我删除了示例代码,因为(a(它与我在这里的建议无关;(b(它引起的兴趣比建议本身更多。

相关内容

最新更新