为什么不在不同单元中调用具有相同签名的函数会导致编译器错误?

All*_*ala 5 delphi lazarus

为什么这段代码不会导致编译错误?我本来期望错误,例如'对"CallMe"的模糊调用.这是编译器或语言中的错误吗?这可以通过使用单元名称和函数调用前面的点来解决,但这不会屏蔽用户代码和库代码以防止名称冲突.你认为你的代码做了一些事情,但它做了别的事情,这很糟糕.

uses
  Unit2, Unit3;

{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(CallMe(5)));
end;

unit Unit2;
{$mode objfpc}{$H+}
interface
uses
  Classes, SysUtils;
function CallMe(A: Integer) : Integer;
implementation
function CallMe(A: Integer) : Integer;
begin
  Result := A * 2;
end;
end.

unit Unit3;
{$mode objfpc}{$H+}
interface
uses
  Classes, SysUtils;
function CallMe(A: Integer) : Integer;
implementation
function CallMe(A: Integer) : Integer;
begin
  Result := A * -1;
end;
end.
Run Code Online (Sandbox Code Playgroud)

LU *_* RD 13

来自文档:

如果两个单元声明了具有相同名称的变量,常量,类型,过程或函数,则编译器将使用uses子句中最后列出的单元中的一个.(要从其他单元访问标识符,您必须添加限定符:UnitName.Identifier.)

  • @ user2304430:你仍然忽略了这是设计的事实,并且是**记录的行为**.即使在你的人为设计的例子中也没有任何*含糊不清*,因为**记录的行为**是将它解析为与函数匹配的最后一个使用的单位.编译器没有看到任何歧义,因为它在解析它时的行为与设计(并记录)完全相同. (3认同)