將專案存為 SQR.pas,單元名稱即為 SQR。程式碼呼叫 Sqr(StrToInt(...)) 時,編譯器誤以為參考該單元而非系統函數 System.Sqr,報錯 . expected but ( found。
{ 錯誤範例 }
unit SQR; // 單元名稱 = SQR
procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption := IntToStr(Sqr(StrToInt(Edit1.Text))); // 編譯器以為是單元名稱
end;
解決:重新命名單元為非保留字(如 NotSQR.pas),即恢復正常。
若在同一單元或較近的命名空間宣告同名函數,會遮蔽系統函數。
function Sqr(Input: Integer): Integer; // 自訂 Sqr
begin
Result := Input + 1; // 故意改變行為
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(Sqr(2))); // 顯示 3 而非 4
end;
SysUtils、Classes、Types、Math、DateUtils、StrUtils、Sqr、Sqrt、Abs 等)。MyApp_Utils、Prj_Core。System.Sqr(...) 強制呼叫系統函數。{$WARN SYMBOL_PLATFORM OFF} 等可抑制特定警告,但不解決衝突根本。Delphi 識別項查找順序:局部變數 → 參數 → 類別成員 → 單元介面區宣告 → 介面區引用的其他單元 → System 單元。越近的作用域優先級越高,因此單元名稱、區域函數皆可能遮蔽系統符號。