Tại sao mã này không dẫn đến lỗi trình biên dịch? Tôi đã có thể mong đợi lỗi ví dụ 'gọi mơ hồ đến "CallMe"'. Đây có phải là lỗi trong trình biên dịch hoặc bằng ngôn ngữ không? Điều này có thể làm việc xung quanh bằng cách sử dụng tên đơn vị và một dấu chấm ở phía trước của cuộc gọi hàm nhưng điều này không bảo vệ mã người dùng và mã thư viện chống lại xung đột tên. Bạn nghĩ rằng mã của bạn đã làm một cái gì đó nhưng nó đã làm một cái gì đó khác và đó là xấu.Tại sao không gọi một hàm có chữ ký giống hệt nhau trong các đơn vị khác nhau dẫn đến lỗi trình biên dịch?
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.
Đây là theo thiết kế: Nó gọi trình biên dịch đã thấy cuối cùng trong quá trình biên dịch. Nếu bạn muốn gọi cho người khác, hãy thêm tên đơn vị vào trước theo sau là dấu chấm cho tên. – MartynA
Cảm ơn. Tôi muốn biết động lực đằng sau thiết kế này. Điều này tạo cơ hội cho các lỗi. Giả sử đơn vị ban đầu sử dụng CallMe từ Unit2 thì lập trình B đến và thêm unit3 vì anh ta cần một số chức năng từ đó và không biết rằng anh ta vô tình thay thế CallMe bằng một thứ khác (tưởng tượng một đơn vị dài có nhiều mã). Nó biên dịch và chạy. Không cảnh báo không có lỗi. Tôi thà có một lỗi biên dịch hơn là một vấn đề thời gian chạy và tôi không muốn AVeryLongLibraryName.FunctionName cuộc gọi và để xem mọi cuộc gọi trong mỗi đơn vị bao gồm cho một cuộc gọi mơ hồ. –
Bất kỳ ngôn ngữ lập trình nào cũng tạo cơ hội cho các lỗi. Toàn bộ điều là: bạn phải biết mình đang làm gì. Có những công cụ bên ngoài cung cấp cho bạn gợi ý về những trường hợp đó. –