Delphi 如何在不抑制所有提示的情况下处理分配给“%s”从未使用过的消息的虚假“H2077值”?

Delphi 如何在不抑制所有提示的情况下处理分配给“%s”从未使用过的消息的虚假“H2077值”?,delphi,Delphi,Delphi 10.3 Rio针对以下代码发出虚假的H2077警告: x:=TFoo.Create; y:=零; 尝试 y:=可以抛出的函数; //使用x和y 最后 x、 免费的; y、 免费的; 终止 注意:即使编译器可以证明函数不能抛出,警告仍然是不必要的,因为AFAIK无法通过在其他语言中声明函数nothrow并在调用站点断言nothrow属性来将函数锁定为非抛出状态。因此,编写代码时必须假设函数可以抛出 我想抑制无用/错误的提示,但显然不可能抑制提示H2077,只抑制所有提示或无提示。如

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

x:=TFoo.Create; y:=零; 尝试 y:=可以抛出的函数; //使用x和y 最后 x、 免费的; y、 免费的; 终止 注意:即使编译器可以证明函数不能抛出,警告仍然是不必要的,因为AFAIK无法通过在其他语言中声明函数nothrow并在调用站点断言nothrow属性来将函数锁定为非抛出状态。因此,编写代码时必须假设函数可以抛出

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

另外,我希望避免编写多余的第二个try/finally帧,因为它会使源代码变得混乱,并创建不必要的目标代码。最简单、最明显的替代方法是调用一个空的伪过程,如假装使用,它接受一个TObject参数,但不做任何处理,这将创建一个不必要的全局依赖项,也很可能是多余的函数调用。因此,我希望你能给我一个更好的建议

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

孵育; y:=零; 尝试 y:=可以抛出的函数; //使用y和Indy堆栈 最后 TIdStack.decussion; y、 免费的; 终止
Indy stack是我目前正在研究的东西,但进入/离开关键部分可能是更常见的情况。

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

在我的实用程序包括单元中,我有如下例程:

过程编译器inti:整数;超载

过程防止编译器提示:字符串;超载

这些是空的例程,只包括开始和结束;街区

我只是调用这些例程来向编译器显示我实际上正在使用所讨论的变量

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

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

你想怎么做就怎么做


注意:我删除了示例代码,因为它与我的建议无关;b它比建议本身产生了更多的兴趣。

y:=nil是多余的,去掉它。@SertacAkyuz:不,这是绝对重要的,如果函数可以抛出异常,假设y是局部变量。你不想做y。如果y是一个随机指针,那么是Free。另一方面,我的经验是,这个提示几乎总是正确的。你能分享一个完整的例子,其中这个提示显示不正确吗?但是,警告x可能尚未初始化,并且返回值可能未定义。尽管代码显然是正确的,但经常会发出警告。AFAIAA,您必须遵守这一点。RSP-13780可以解决这个问题——如果它要获得更多的选票,EMBT可能会感到麻烦,某位经理可能会被说服,比如W1057比其他品牌更国际化_CAST@DarthGizka即使您不想这样做,但使用嵌套的try.finally blocks,然后y:=nil,确实可以更好地处理此问题;不会被需要,因此不会被警告,例如:TIdStack.IncUsage;尝试y:=可以抛出的函数;尝试{使用y和Indy堆栈…}最终y.Free;终止最后是TIdStack.decussion;终止这也确保了即使y.罚球也会调用TIdStack.decussion,这是不应该的,但你永远也不知道。你有没有试过如果你将这些过程声明为内联的话,这是否仍然有效?首先,我认为在这种情况下,goto NEXT_W最好用continue替换,但除此之外,在这个代码示例中,我觉得警告是正确的。@Dsm-这是一个简略的代码,在下一个标签我用一个ellipsis@Dsm-此警告对我来说是不正确的。ex在第一次传递时始终为0,因此thisWordGroupID设置为该值。在后续的传递ex>0时,我将确保与提示引用的变量具有相同的组ID。我知道总是有后续的过程W.Elements.Count总是>=2。@FreeDorfman可能您缺少begin/end语句。当ex=0时,drop将设置为TRUE,并执行中断。因此,除非在显示的代码之外使用thisWordGroupID,否则警告是正确的。这也是删除break语句将删除警告的原因。