如何在 Delphi 中禁用关于“返回值......可能未定义”的警告?

Posted

技术标签:

【中文标题】如何在 Delphi 中禁用关于“返回值......可能未定义”的警告?【英文标题】:How to disable a warning in Delphi about "return value ... might be undefined"? 【发布时间】:2008-09-14 15:40:38 【问题描述】:

我有一个给我以下警告的函数:

[DCC 警告] filename.pas(6939): W1035 函数“function”的返回值可能未定义

然而,这个函数是干净的、小的,并且确实有一个已知的、预期的返回值。函数中的第一条语句是:

Result := '';

也没有称为Result的局部变量或参数。

是否有任何一种类似编译指示的指令我可以围绕这个方法来删除这个警告?这是 Delphi 2007。

很遗憾,此 Delphi 安装的帮助系统无法正常工作,因此我现在无法弹出该警告的帮助。

谁知道我能做什么?

【问题讨论】:

@NGLN 在链接的副本中,代码没有明确设置Result,在这种情况下编译器警告可能是因为编译器没有看到Abort 将终止该方法而不允许它正确返回。然而,在我的问题中,代码肯定设置了Result,因为它实际上是该方法的第一个语句。你确定这是一个很好的副本吗? 哦,射击,我使用了dupe hammer;那不是我的本意。我现在可以看到不同之处,但我认为标题应该类似于 为什么这个返回值未定义(以及如何解决)?。但如果不是重复的,我仍然不确定这个问题不应该被关闭,因为它听起来像 Too Localized。我将投票重新开放,因为在发布 this answer 时没有将任何一个标记为欺骗,并留给社区来决定。 【参考方案1】:

您确定您已尽一切努力解决警告吗?或许你可以把代码贴出来让我们看看?

您可以通过这种方式在本地关闭警告:

$WARN NO_RETVAL OFF
function func(...): string;
begin
  ...
end;
$WARN NO_RETVAL ON

【讨论】:

函数中的第一条语句是给函数一个默认的返回值。该函数的其余部分是一个 case 语句和一些从 case 点对其他函数的调用。【参考方案2】:

我不确定我想看这个单元的代码...毕竟,错误发生在第 6939 行...可能超出了某些内部编译器表?

【讨论】:

我同意。我在包含带有嵌套分支的大型 case 语句的方法中看到了 D2006 的此警告。无论删除了哪些分支,删除一些代码路径都会使警告消失。因此,在编译器停止查找并假设必须至少有一个路径没有设置结果之前,可能发生的分支数量似乎是有限的 :)【参考方案3】:

Delphi 中似乎存在某种错误。阅读这篇文章,最后一条评论链接到可能是您得到的其他错误报告:

http://qc.codegear.com/wc/qcmain.aspx?d=8144

【讨论】:

我知道,还有一个类似的错误报告,关于太多的局部变量和参数组合导致这个,但这个功能真的很简单。无论如何,Delphi 是错误的。还有什么新东西:)【参考方案4】:

$WARN NO_RETVAL OFF 是您要查找的内容,但通常我喜欢找出发生这种情况的原因。您可能会考虑以不同的方式对其进行格式化,看看是否有帮助。

你那里有任何改变流程的命令,比如 Exit 吗?您是否直接引发异常等?您的 case 语句最后是否有一个 else 来设置 Result 的值?

可能会尝试调整这些元素,看看是否也消除了警告。

【讨论】:

【参考方案5】:

为了得到一个好的答案,您必须发布代码。通常,如果存在可能导致未定义结果的代码路径,Delphi 编译器将给出此警告。有时该代码路径不太明显。

【讨论】:

当代码路径遵循显式初始化“结果”的初始无条件代码行(如问题中所述)时,无论代码路径多么不明显,警告都是虚假的(在此案例)。 我同意我们需要查看代码以提供帮助。根据我的经验,当返回类型为字符串时,Delphi 从不警告缺少返回值。即使未设置结果。【参考方案6】:

至少从Delphi4开始,Delphi编译器就有这样一个bug:如果函数参数(包括Self和Result)和局部变量的数量之和超过31,就会导致问题。例如,它可以写入 W1035 警告(结果可能未定义)。它可能会错过未使用的变量。试试这个项目:

program TestCompilerProblems;

procedure Proc;
var
  a01, a02, a03, a04, a05, a06, a07, a08, a09, a10,
  a11, a12, a13, a14, a15, a16, a17, a18, a19, a20,
  a21, a22, a23, a24, a25, a26, a27, a28, a29, a30,
  a31, a32, a33, a34, a35, a36, a37, a38, a39, a40: Integer;
begin
end;

begin
  Proc;
end.

这将导致 31 个提示,而不是 40 个。

【讨论】:

以上是关于如何在 Delphi 中禁用关于“返回值......可能未定义”的警告?的主要内容,如果未能解决你的问题,请参考以下文章

在Delphi中如何获得SQL中存储过程的返回值?

delphi如何判断RichEdit是不是显示到底部了?

Delphi XE6 Firemonkey Mobile - 如何禁用虚拟键盘?

delphi 怎么动态调用dll中的过程

Delphi调用Dll返回结构体的问题?

delphi实现函数/过程