【问题标题】:Wierd Delphi behavour [duplicate]奇怪的德尔福行为[重复]
【发布时间】:2020-05-14 22:57:03
【问题描述】:

由于我的代码中的一个错误,我偶然发现了这种情况:-

function Bogus: string;
begin
end;

var
  s: string;
begin
  s:='Original value';
  s:=Bogus;
  MessageDlg(s, mtInformation, [mbOK], 0);
end.

将显示Original value 的对话框,其中我的函数调用的非结果对我的 var 没有影响;我本来以为它是空的。

这是预期的行为吗?可以依靠吗?有人真的会故意实施吗??!?

我从 1995 年开始使用 Delphi,之前从未遇到过这种情况。
(直到今天,我仍然不会从 IDE 放置的光标中选择文本,因为编译错误会导致 Delphi 1.0 崩溃!!!)

【问题讨论】:

    标签: delphi


    【解决方案1】:

    在幕后,Bogus()string 返回值是使用隐藏的 var 参数传递的(不是 out 参数,就像您想的那样),好像你写的是这样的代码:

    procedure Bogus(var Result: string);
    begin
    end;
    
    var
      s: string;
    begin
      s:='Original value';
      Bogus(s);
      MessageDlg(s, mtInformation, [mbOK], 0);
    end.
    

    由于Bogus() 没有为其Result 分配任何内容,原始string 值被保留(未定义的行为),这就是您能够在@987654330 中看到它的原因之后@@。

    但是,这是一个广为人知的实现细节,您不应该依赖它。您应该始终something 分配给functionResultdocumentation 只是说:

    如果函数退出时没有为Result 或函数名赋值,那么函数的返回值是未定义的

    【讨论】:

    • 啊哈,非常感谢。我确实先搜索了答案,但显然没有想到要搜索的正确单词!我唯一担心的是它没有产生编译器提示/警告(至少在 Delphi 6.0 中——我没有尝试所有的编译器!)。感谢您快速明确的回答:)
    猜你喜欢
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    相关资源
    最近更新 更多