【问题标题】:Why can I call a function without comma separating the parameters in Delphi?为什么我可以在 Delphi 中调用不使用逗号分隔参数的函数?
【发布时间】:2019-03-01 15:09:33
【问题描述】:

我在 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 会有这种行为?这是某种编译器错误还是奇怪的机制?

【问题讨论】:

  • Delphi 有很多奇怪的语法“特性”。我将其归因于错误,耸耸肩,然后继续前进。 (例如,函数装饰关键字(如 virtual、abstract、overload、inline、stdcall、static 等)的允许顺序以及问题,它们是否需要、容忍或不喜欢它们之间的分号)
  • 编译器错误.....

标签: delphi delphi-5


【解决方案1】:

这似乎是一个编译器错误,至少从 D2010 开始就已经修复,并且可能更早。 Delphi 5 在撰写本文时已有 20 年历史,默认参数仅在 D4 中引入,因此有一些早期问题已得到纠正是有道理的。

【讨论】:

  • 想过这个问题,但奇怪的是,即使有错误,编译器也设法将参数值指向正确的位置,因为我认为它会搜索逗号
  • 解析器不搜索特定的东西。他们使用标记器。所以这种bug是很容易理解的。
  • 我对这个过程的理解相当肤浅,但是它不是根据特定分隔符的存在来寻找标记吗,在这种情况下是逗号?
  • 这取决于您对解析器搜索逗号的假设不是它的工作方式。将有一个消耗令牌的循环。并且该错误将类似于解析器未检测到省略逗号。
  • @RodolfoDonãHosp 默认参数仅在 D4 中引入。为该语言功能添加的标记化例程中显然存在错误。只有开发人员才能说出根本原因是什么,但新语言功能在第一或两次迭代中没有完全出现并不罕见。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-22
  • 1970-01-01
  • 2013-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多