Почему этот код не приводит к ошибке компилятора? Я бы ожидал ошибки, например, «неоднозначный вызов« 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.
Это по дизайну: он называет тот, который компилятор видел во время компиляции. Если вы хотите позвонить другому, добавьте имя единицы, за которым следует точка. – MartynA
Спасибо. Я хотел бы узнать мотивацию этого дизайна. Это дает возможность для ошибок. Предположим, что основной блок первоначально использовал CallMe от Unit2, затем программист B входит и добавляет unit3, потому что ему нужна какая-то функция оттуда и не знает, что он случайно заменил CallMe чем-то другим (представьте себе длинную единицу с большим количеством кода). Он компилируется и запускается. Никакого предупреждения нет. Я бы предпочел ошибку компилятора, чем проблему времени выполнения, и я не хочу, чтобы вызывали вызовы AVeryLongLibraryName.FunctionName и просматривали каждый вызов в каждом включенном модуле для двусмысленного вызова. –
Любой язык программирования дает возможность для ошибок. Все дело в том, что вы должны знать, что делаете. Существуют внешние инструменты, которые дают вам подсказки по этим случаям. –