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

3
我正在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.

而且它编译通过,没有抛出异常,并且参数按预期完全传递到函数中。

我注意到的是,如果我移除最后的默认参数,它开始抛出编译错误 Not enough actual parameters

为什么Delphi有这种行为?这是一种编译器错误还是奇怪的机制?


4
Delphi有很多奇怪的语法“特性”。我认为这可能是个bug,然后就放手不管了。(比如,函数修饰关键字的顺序允许任意排列,如virtual、abstract、overload、inline、stdcall、static等,问题是它们是否需要、容忍或不喜欢它们之间有分号) - JensG
4
编译器错误... - David Heffernan
1个回答

5

这似乎是一个编译器的错误,自D2010以来已经得到修复,很可能更早就被修复了。截至本文写作时,Delphi 5已经有20年历史了,而默认参数仅在D4中引入,因此可以推断出早期存在一些问题,现在已经得到纠正。


考虑过这一点,但即使存在错误,编译器仍然能够将参数值指向其正确的位置,因为我认为它会搜索逗号。 - Rodolfo Donã Hosp
4
解析器不会寻找特定的内容,它们使用分词器。因此,这种错误是可以理解的。 - David Heffernan
我对这个过程的理解很浅,但它不是根据特定分隔符的存在来查找标记吗?在这种情况下,是逗号吧? - Rodolfo Donã Hosp
4
这要看情况,但你假设解析器搜索逗号的想法是错误的。实际上会有一个循环来消耗标记。而问题可能是解析器未能检测到逗号被省略了。 - David Heffernan
1
@RodolfoDonãHosp 默认参数仅在D4中引入。 显然,在为此语言功能添加的标记化例程中存在错误。 只有开发人员才能说出根本原因,但是新语言功能在前两次迭代中不完全正确并不罕见。 - J...
谢谢大家的澄清,现在更有意义了。 - Rodolfo Donã Hosp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接