为什么在Delphi中不用逗号分隔参数就可以调用函数?

Rod*_*osp 3 delphi delphi-5

我在Delphi 5中创建了一些函数,并且偶然地我尝试在不使用逗号分隔参数列表的情况下进行编译,而且奇怪的是,它完全正常地工作。

我尝试如下隔离问题:

program Project1;
{$APPTYPE CONSOLE}

procedure foo(i : integer; s : string; di : integer = -1);
begin
  WriteLn(s);
end;

var
  str: string;
  int: integer;
begin
  str := 'aaa';
  int := 1000;
  foo(int str int);
  ReadLn;
end.
Run Code Online (Sandbox Code Playgroud)

它可以编译,不会引发异常,并且参数表完全可以按预期达到功能。

我注意到的是,如果最后删除默认参数,它将开始引发编译错误 Not enough actual parameters

为什么德尔福会有这种行为?这是某种编译器错误还是怪异的机制?

J..*_*... 5

这似乎是一个编译器错误,至少在D2010或更早之前已得到修复。截至撰写本文时,Delphi 5已有20年历史,默认参数仅在D4中引入,因此可以断定某些早期问题已得到纠正。

  • 解析器不搜索特定内容。他们使用令牌生成器。因此,这种错误是可以理解的。 (4认同)
  • 这取决于但您假设解析器搜索逗号不是它的工作原理。将有一个使用令牌的循环。该错误将类似于解析器无法检测到逗号被省略的情况。 (4认同)