Warum führt dieser Code nicht zu einem Compilerfehler? Ich hätte beispielsweise einen mehrdeutigen Anruf bei CallMe erwartet. Ist das ein Fehler im Compiler oder in der Sprache? Dies kann unter Verwendung des Gerätenamens und eines Punktes vor dem Funktionsaufruf geschehen, wobei jedoch Benutzercode und Bibliothekscode nicht gegen Namenskollisionen geschützt werden. Du denkst, dass dein Code etwas getan hat, aber es hat etwas anderes gemacht und das ist schlecht.Warum führt das Aufrufen einer Funktion mit identischen Signaturen in verschiedenen Einheiten nicht zu einem Compilerfehler?
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.
Das ist von Entwurf: Es ruft das auf, das der Compiler zuletzt während des Kompilierens gesehen hat. Wenn Sie den anderen anrufen möchten, setzen Sie den Gerätenamen gefolgt von einem Punkt auf den Namen. – MartynA
Danke. Ich würde gerne die Motivation hinter diesem Design wissen. Dies macht eine Chance für Bugs. Nehmen wir an, dass die Haupteinheit ursprünglich CallMe von Unit2 und dann von Programmierer B verwendet hat und Unit3 hinzufügt, weil er eine Funktion von dort benötigt und nicht weiß, dass er versehentlich CallMe durch etwas anderes ersetzt hat (stellen Sie sich eine lange Einheit mit viel Code vor). Es kompiliert und läuft. Keine Warnung, kein Fehler. Ich hätte lieber einen Compilerfehler als ein Laufzeitproblem, und ich möchte keine AVeryLongLibraryName.FunctionName-Aufrufe und jeden Aufruf in jeder enthaltenen Einheit für einen mehrdeutigen Aufruf suchen. –
Jede Programmiersprache bietet eine Möglichkeit für Fehler. Die ganze Sache ist: Sie müssen wissen, was Sie tun. Es gibt externe Tools, die Ihnen Hinweise zu diesen Fällen geben. –