Bu kod neden bir derleyici hatasıyla sonuçlanmıyor? Örneğin, "CallMe" ye "belirsiz çağrı" hatası vermeyi beklerdim. Bu derleyici veya dilde bir hata mı? Bu, ünite adını ve işlev çağrısının önündeki bir noktayı kullanarak çalışabilir, ancak bu, kullanıcı kodlarını ve kitaplık kodunu isim çarpışmasına karşı korumaz. Kodunuzun bir şey yaptığını düşünüyorsunuz ama başka bir şey yaptı ve bu kötü. documentation kaynaktanNeden farklı birimlerde aynı imzalarla bir işlev çağırmıyor derleyici hatasıyla sonuçlanır?
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.
Bu tasarım gereğidir: Derleme sırasında derleyicinin gördüğü en son olanı çağırır. Diğerini aramak isterseniz, ünite adını ve ardından isme bir nokta ekleyin. – MartynA
Teşekkürler. Bu tasarımın ardında yatan motivasyonu bilmek istiyorum. Bu, hatalar için bir fırsat yaratır. Ana ünitenin Unit2'den orijinal olarak CallMe'yi kullandığını ve programcı B'nin gelip ünite3'ü eklediğini, çünkü oradan bir fonksiyona ihtiyaç duyduğunu ve yanlışlıkla CallMe'nin başka bir şeyle değiştirildiğini bilmediğini söyleyelim (uzun bir üniteyi çok fazla kod düşünün). Derler ve çalışır. Uyarı yok hata yok. Bir çalışma zamanı probleminden daha çok bir derleyici hatası istiyorum ve AVeryLongLibraryName.FunctionName çağrılarını istemiyorum ve belirsiz bir çağrı için her bir birimdeki her aramayı arayın. –
Herhangi bir programlama dili hatalar için bir fırsat yaratır. Her şey: ne yaptığını bilmek zorundasın. Bu vakalar hakkında size ipuçları veren harici araçlar var. –