首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 命名規則陷阱:單元名稱與保留字衝突、自訂函數覆蓋系統函數

     編輯:Delphi

案例一:單元名稱與系統函數同名導致編譯錯誤

將專案存為 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;

命名最佳實務

  1. 單元名稱:避免與 RTL/VCL 常用函數、類別、保留字同名(如 SysUtils、Classes、Types、Math、DateUtils、StrUtils、Sqr、Sqrt、Abs 等)。
  2. 識別項前綴:建議為專案/模組加上前綴,如 MyApp_Utils、Prj_Core。
  3. 函數/變數命名:避免與系統常用識別項同名;若必須同名,明確加上單元前綴 System.Sqr(...) 強制呼叫系統函數。
  4. 編譯器指令:{$WARN SYMBOL_PLATFORM OFF} 等可抑制特定警告,但不解決衝突根本。

編譯器解析順序

Delphi 識別項查找順序:局部變數 → 參數 → 類別成員 → 單元介面區宣告 → 介面區引用的其他單元 → System 單元。越近的作用域優先級越高,因此單元名稱、區域函數皆可能遮蔽系統符號。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved